Oracle程序员面试分类模拟9.docx
《Oracle程序员面试分类模拟9.docx》由会员分享,可在线阅读,更多相关《Oracle程序员面试分类模拟9.docx(12页珍藏版)》请在冰豆网上搜索。
Oracle程序员面试分类模拟9
Oracle程序员面试分类模拟9
简答题
1.如何判断—个存储过程是否正在运行?
答案:
有两种方式可以判断一个存储过程是否正在运行,其查询SQL语句分别如下,若有结果返回,则说明存储过程正在运行。
方法1:
方法2:
2.如何将文本文件或Excel中的数据导入数据库?
答案:
有多种方式可以将文本文件的数据导入到数据库中,例如,利用PLSQLDeveloper软件进行复制粘贴,利用外部表,利用SQL*Loader等方式。
至于Excel中的数据可以另存为csv文件(csv文件其实是逗号分隔的文本文件),然后导入到数据库中。
下面简单介绍一下SQL*Loader的使用方式。
SQL*Loader是一个Oracle工具,能够将数据从外部数据文件装载到数据库中。
SQL*Loader必须包含一个控制文件,该控制文件是SQL*Loader的中枢核心,控制文件能够控制外部数据文件中的数据如何映射到Oracle的表和列。
通常与SPOOL导出文本数据方法配合使用。
SQL*Loader能够接收多种不同格式的数据文件。
文件可以存储在磁盘或磁带上,或记录本身可以被嵌套到控制文件中。
记录格式可以是定长的或变长的,定长记录是指这样的记录:
每条记录具有相同的固定长度,并且每条记录中的数据域也具有相同的固定长度、数据类型和位置。
SQL*Loader的数据导入比较专业,有各种参数及选项可供选择,经常是作为数据仓库中大型数据的导入方法选择。
SQL*Loader的优点:
1)可将导入命令写入BAT文件直接批量处理。
2)导入处理比较专业,提供各种参数选择。
3)无需操作Oracle所在服务器。
SQL*Loader也有缺点,例如,Excel文件需要另存为txt或csv格式才能导入到数据库中。
总的来说这种方法是最值得采用的,可以自动建立操作系统的批处理文件执行SQL*Loader命令,将数据导入原始接收表,并在数据库中设置触发器进行精细操作。
SQL*Loader有两种使用方法:
1)只使用一个控制文件,在这个控制文件中包含数据。
2)使用一个控制文件和一个数据文件。
SQL*Loader工具使用的命令为sqlldr,其常用参数的含义见表1。
下面给出SQL*Loader控制文件的一个示例:
其中,CHARACTERSET指定文件的编码格式,infile指定导入的文件。
接下来就是执行导入命令了,如下:
当要加载的数据文件比较大的时候该如何提高SQL*Loader的性能呢?
可以从以下几个方面考虑:
1)ROWS的默认值为64,可以根据需要指定更合适的ROWS参数来指定每次提交记录数。
2)米用DIRECT=TRUE导入可以跳过数据库的相关逻辑,直接将数据导入到数据文件中,可以提高导入数据的性能。
3)通过指定UNRECOVERABLE选项,可以写少量的日志,从而提高数据加载的性能。
不过,推荐在加载完成后立即对数据库或至少对表空间备份。
当加载大量数据时,最好抑制日志的产生:
将表修改为NOLOGGING,可以只产生少量的Redo日志,从而提高导入效率。
在CONTROL文件中的loaddata前边加一行:
UNRECOVERABLE,此选项必须要与DIRECT共同使用。
对于超大数据文件的导入就要用并发操作了,即同时运行多个导入任务:
表2给出在使用SQL*Loader的过程中,一些常用的需求实现方法。
表3给出了在使用SQL*Loader的过程中,常遇到的错误及其解决方法。
关于SQL*Loader还有很多参数本书不再详述,具体可以参考官方文档。
有关如何导出数据到Excel中,本书也不再详述。
3.什么是Quote(q)语法?
答案:
在SQL查询中,会经常需要原样输出字符串,如果字符串中含有大量的单引号、双引号或者特殊字符,那么需要用单引号转义拼接字符串,这样会非常的麻烦。
所以,Oracle提供了一个Q-quote的表达式来原样输出字符串。
需要注意以下几点:
1)Q-quote定界符可以是除了TAB、空格、回车外的任何单字节或多字节字符,包括数字、字母、特殊字符。
但'&'不能作为分隔符,因为'&'意思是传入参数。
2)Q'后跟起始分隔符,起始分隔符后的字符串原样输出,起始分隔符必须有配对的结束分隔符。
'['、'('、'{'作为分隔符,必须以']'、')'、'}'结束。
4.怎么捕获用户登录信息,如SID,IP地址等?
答案:
可以利用登录触发器来实现。
5.怎么捕获整个数据库的DDL语句或者是说捕获对象结构变化与修改?
答案:
可以采用DDL触发器进行捕获。
6.怎么捕获表上的DML语句?
答案:
可以采用DML触发器进行捕获。
7.如何实现分组取前3条记录?
答案:
可以利用分析函数,如获取每个部门薪水前三名的员工或每个班成绩前三名的学生,如下:
8.如何把相邻记录合并到一条记录?
答案:
可以利用分析函数LAG与LEAD,它们可以提取后一条或前一天记录到本记录,如下:
9.怎么设置存储过程的调用者权限?
答案:
普通存储过程都是定义者权限,如果想设置调用者权限,那么需要声明“AUTHIDCURRENT_USER”,参考如下语句:
10.Oracle中有哪些常用的字符函数?
答案:
常用的有如下几个函数:
1)lower(char):
将字符串全部转化为小写的格式。
2)upper(char):
将字符串全部转化为大写的格式。
3)initcap('SQLcourse'):
每个单词的首字母大写,其余变为小写,结果:
SqlCourse。
4)concat('Hello','World'):
字符串连接,结果:
HelloWorld。
5)length(char):
返回字符串的长度。
6)substr(char,m,n):
取字符串的子串,m表示起点,n代表取n个字符的意思。
7)replace(char1,search_string,replace_string):
替换函数。
8)instr(char1,char2,[,n[,m]]):
取子串在字符串的位置,特别取某一个特殊字符在原字符串中的位置。
9)trim('HelloWorld'):
前后去掉空格,结果为:
“Helloworld”。
10)ltrim('HelloWorld'):
左边去掉空格,结果为:
“HelloWorld”。
11)rtrim('HelloWorld'):
右边去掉空格,结果为:
“HelloWorld”。
12)lpad(salary,10,'*'):
左补齐,结果:
*****24000。
13)rpad(salary,10,'*'):
右补齐,结果:
24000*****。
14)chr():
将ASCII码转换为字符。
15)ascii():
将字符转换为ASCII码。
11.如何查看存储过程的编译错误?
答案:
在存储过程编译完成后使用SHOWERROR命令即可查看。
12.如果查询的列中含有特殊字符,如通配符“%”与“_”,那么该如何查询这些特殊字符?
答案:
利用ESCAPE来查询,如下:
13.如何插入单引号到数据库表中?
答案:
可以用ASCII码处理,其他特殊字符如&也一样,如下:
或者用两个单引号表示一个:
14.十进制与十六进制如何转换?
答案:
十进制转换为十六进制用TO_CHAR:
十六进制转换为十进制用TO_NUMBER:
15.如何随机抽取表SCOTT.EMP的前5条记录?
答案:
使用SYS_GUID或DBMS_RANDOM.VALUE函数,如下:
16.如何抽取重复记录?
答案:
使用ROWID来查询,如下例找出ID重复的记录:
或者,下例找出COL_A和COL_B列重复的记录:
如果想删除重复记录,可以把第一个语句的SELECT替换为DELETE。
17.怎么快速获得用户下每个表或表分区的记录数?
答案:
可以分析该用户,然后查询USER_TABLES字典,或者采用脚本实现。
18.SYS_CONTEXT和USERENV的用法是什么?
它们可以返回哪些常用的值?
答案:
SYS_CONTEXT函数是Oracle提供的一个获取环境上下文信息的预定义函数。
该函数用来返回一个指定NAMESPACE下的PARAMETER值。
该函数可以在SQL和PL/SQL语言中使用,常用的扳回信如下:
USERENV函数用来返回当前的会话信息,常用的有如下信息: