数据库程序员面试分类真题9_第1页
数据库程序员面试分类真题9_第2页
数据库程序员面试分类真题9_第3页
数据库程序员面试分类真题9_第4页
数据库程序员面试分类真题9_第5页
已阅读5页,还剩4页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

数据库程序员面试分类真题9简答题1.

RAC中如何指定JOB的运行实例?正确答案:在RAC中,可以让JOB在某个指定的实例上运行。对于DBMS_JOB和DBMS_SCHEDuLER来说,它们的指定(江南博哥)方法不同:

1)在DBMS_JOB下,执行SYS.DBMS_JOB.SUBMIT包创建JOB的时候,可以指定INSTANCE参数,该参数指定了JOB运行的实例。

2)DBMS_SCHEDULER下指定实例运行JOB稍微有点复杂,首先创建SERVICE,再创建JOB_CLASS,最后创建JOB才可以。[考点]JOB

2.

如何判断SCHEDULERJOB是否正在运行?正确答案:可以查询DBA_SCHEDULER_JOBS视图的STATE列,若STATE列的值为RUNNING,则代表当前的JOB正在运行。或者通过查询视图DBA_SCHEDULER_RUNNING_JOBS,该视图中的JOB即正在运行的JOB。[考点]JOB

3.

如何查询SCHEDULERJOB的运行日志?正确答案:可以通过查询视图DBA_SCHEDULER_JOB_RUN_DETAILS来获取SCHEDULERJOB的运行日志、产生的错误等信息。代码如下:

SELECTJRD.LOG_ID,JRD.JOB_NAME,N.JOB_CLASS,

TO_CHAR(JRD.LOG_DATE,'YYYY-MM-DDHH24:MI:SS')LOG_DATE,

JRD.STATUS,JRD.ERROR#,JRD.RUN_DURATION运行时长,JRD.ADDITIONAL_INF.O

FROMDBA_SCHEDULER_JOB_LOGN,DBA_SCHEDULER_JOB_RUN_DETAILSJRD

WHEREN.LOG_ID=JRD.LOG_ID

ANDN.JOB_NAME='JOB_INSERT_SQL_LHR'

--JOB的名称

ORDERBYJRD.LOG_IDDESC;

从查询结果中可以看到,JOB_INSERT_SQL_LHR从2016-11-2913:03:36开始执行的时候就报错了,报错信息可以从ADDITIONAL_INFO列里找到,其报错的具体信息如下:

ORA-01658:unabletocreateINITIALextentforsegmentintablespaceTS_LHR

ORA-06512:at"DB_MONITOR.PKG_SQL_HISTORY_LHR",line180

可见,涉及的程序是DB_MONITOR用户下的PKG_SQL_HISTORY_LHR包,而ORA-01658的错误是由于表空间不足引起的。[考点]JOB

4.

如何批量删除JOB?正确答案:可以采用SQL来生成删除JOB的语句,首先执行以下语句,可以根据情况对结果进行过滤:

SELECT'EXECDBMS_SCHEDULER.DROP_JOB('''||JOB_NAME||''',TRUB);FROM

USER_SCHEDULER_JOBST1;

将以上SQL生成的结果复制到命令窗口就可以批量执行了。[考点]JOB

5.

SQL*Plus中@和@@的区别是什么?正确答案:@和@@都可以调用脚本,它们的不同之处如下:

@等于start命令,用来运行一个SQL脚本文件。@命令调用当前目录下的,或指定全路径,或可以通过SQLPATH环境变量搜寻到的脚本文件。

@@用在脚本文件中,用来指定“@执行的脚本文件”与“@@执行的脚本文件”在同一目录,而不用指定全路径,也不从SQLPATH环境变量指定的路径中寻找文件,该命令一般用在嵌套脚本文件中。[考点]SQL*Plus

6.

SQL*Plus中&与&&的区别是什么?正确答案:&用来创建一个临时变量,每当遇到这个临时变量时,都会提示输入一个值。

&&用来创建一个持久变量,就像用DEFINE命令或带NEW_VLAUE子句的COLUMN命令创建的持久变量一样。当使用&&命令引用这个变量时,不会每次遇到该变量就提示用户键入值,而只有在第一次遇到时提示一次。[考点]SQL*Plus

7.

glogin.sql脚本的作用是什么?正确答案:SQL*Plus在启动的时候会自动查找运行两个脚本文件:login.sql和glogin.sql。

login.sql文件可以存放SQL*Plus中能使用的任何命令。SQL*Plus在启动时会首先查找当前目录下的login.sql文件,其次会在SQLPATH目录下查找。如果找到login.sql文件,那么在SQL*Plus显示“SQL>”前执行login.sql里的所有内容。

glogin.sql是SQL*Plus全局登录的配置文件,是Oracle自带的登录脚本文件,它的路径是固定的,即$ORACLE_HOME/sqlplus/admin。当用户启动SQL*Plus的时候,会从这个固定的路径加载glogin.sql。

可以在glogin.sql文件中添加如下的内容:

SETSQLPROMPT"_USER'@'_CONNECT_IDENTIFIER>"

这样,每次登录SQL*Plus的时候,SQL提示符就会变为设置的内容,假设用户为SYS,数据库为lhrdb,则提示符如下:

SQL>SHOWSQLPROMPT

sqlprompt"SQL>"

SQL>SETSQLPROMPT"_USER'@'_CONNECT_IDENTIFIER>"

SYS@lhrdb>

SYS@lhrdb>SHOWSQLPROMPT

sqlprompt"_usee'@'_connect_identifier>"

注意,以上提示符的“>”后有一个空格。[考点]SQL*Plus

8.

SQL*Plus的ERRORLOGGING的作用是什么?正确答案:在Oracle1lg中,可以把SQL或PL/SQL错误信息自动记录到当前用户下的一个表中,而且不会自动删除,默认的表名为SPERRORLOG,也可以指定自己的表名替换默认表名。[考点]SQL*Plus

9.

如何判断一个存储过程是否正在运行?正确答案:有两种方式可以判断一个存储过程是否正在运行,其查询SQL语句分别如下,若有结果返回,则说明存储过程正在运行。

方法1:

SELECTA.SID,B.SERIAL#,A.OWNER,A.OBJECT,A.TYPE,B.SERVER,B.MODULE,B.ACTION,B.LOGON_TIME

FROM

V$ACCESS

A,V$SESSIONB

WHEREA.SD=B.SID(+)AND

A.TYPE='PROCEDURE'

AND

B.STATUS='ACTIVE'

AND

A.OBJECT='P_TEST_LHR';

--注意这里修改成存储过程的名称

方法2:

SELECT*FROM

V$DB_OBJECT_CACHEWHERETYPE='PROCEDURE'ANDNAME='P_TEST_LHR'ANDLOCKS>0ANDPINS>0;[考点]SQL*Plus

10.

当Oracle用户密码含特殊字符时,如何登录?正确答案:当Oracle用户密码含有特殊字符(例如,&、@、$等)时,SQL*Plus和exp或expdp等工具进行登录的时候在写法上有很大的差异。

若密码不含“&”符号,则可以使用双引号将密码括起来进行密码修改:

alteruserlhridentifiedby"l@hkr/0";

若密码包含有“&”符号,则需要首先设置define为off才可以修改密码:

setdefineoff

alteruserscottidentifiedby"$tiger&1231@h\r/0%s,d$";

alteruserscottidentifiedby"$?'$%*H\@f'\<a-q/$-@#<>'}:H$";

若密码包含有“"”双引号,则需要使用password来修改密码:

passwordscott

在Linux平台下,使用不同客户端连接Oracle数据库的写法见下表。Linux平台SQL*Plus工具exp、imp、expdp、impdp普通用户无tnssqlplus'lhr/"l@h\r/0'''expdp'lhr/"l@h\r/0'''有tnssqlplus'lhr/"l@h\r/0'''@LHRDBexpdp'lhr/"l@h\r/0'''@LHRDBsys用户无tnssqlplus/assysdbaexpdp\'/ASSYSDBA\'有tnssqlplus'sys/"l@h\r/0'''@LHRDBassysdbaexpdp\"sys/"l@h\r/0'''@LHRDBassysdba\'正常密码sqlplussys/lhr@lhrdbassysdbaexpdp\'sys/lhr@LHRDBassysdba\'在上表中,含特殊字符密码为l@h\r/0,正常密码为lhr,tns为LHRDB,总的写法原则:密码用双引号括起来,用户名和密码用单引号括起来,然后【用户名】+【密码】+【tns】+【assysdba】用单引号括起来,最后的这个单引号用“\”进行转义。在Windows平台下,使用不同客户端连接Oracle数据库的写法见下表。Windows平台SQL*Plus工具exp、imp、expdp、impdp普通用户无tnssqlpluslhr/"""l@h\r/0"""sqlpluslhr∧"l@h\r/0\"expdplhr/'""'l@h\r/0"""expdplhr∧A"l@h\r/0\"有tnssqlpluslhr/"""l@h\r/0"""@LHRDBsqlpluslhr∧"l@h\r/0\"@LHRDBexpdplhr/'""'l@h\r/0"""@LHRDBexpdplhr∧"l@h\r/0\"@LHRDBsys用户无tnssqlplus/assysdbaexpdp\"/assysdba\"有tnssqlplussys/"""l@h\r/0"""@LHRDBassysdbasqlplussys∧"l@h\r/0\"@LHRDBassysdba

正常密码sqlplussys/lhr@lhrdbassysdbaexpdp\"sys/lhr@LHRDBassysdba\"

在上表中,含特殊字符密码为l@h\r/0,正常密码为lhr,tns为LHRDB,总的原则:密码用3个双引号括起来,或者用一个双引号括起来,然后用“\”将双引号进行转义。

11.

什么是Quote(q)语法?正确答案:在SQL查询中,会经常需要原样输出字符串,如果字符串中含有大量的单引号、双引号或者特殊字符,那么需要用单引号转义拼接字符串,这样会非常麻烦。所以,Oracle提供了一个Q-quote的表达式来原样输出字符串。

SYS@orclasm>SELECTQ'[I'maboy,mynameis'lhrhaha']'FROMDUAL;

O'[I'MABOY,MYNAMEIS'LHRHAHA']'

------------------------------

I'maboy,mynameis'lhrhaha'

需要注意以下几点:

1)Q-quote定界符可以是除了TAB、空格、回车外的任何单字节或多字节字符,包括数字、字母、特殊字符。但'&'不能作为分隔符,因为'&'意思是传入参数。

2)Q'后跟起始分隔符,起始分隔符后的字符串原样输出,起始分隔符必须有配对的结束分隔符。'['、'('、'{'作为分隔符,必须以']'、')'、'}'结束。

12.

怎么捕获用户登录信息,如SID、IP地址等?正确答案:可以利用登录触发器。

13.

怎么捕获整个数据库的DDL语句或者说捕获对象结构变化与修改?正确答案:可以采用DDL触发器。

14.

怎么捕获表上的DML语句?正确答案:可以采用DML触发器。

15.

如何从Oracle数据库中获得毫秒?正确答案:在Oracle9i以上版本,有一个TIMESTAMP类型可以用来获得毫秒,如:

SQL>SELECTTO_CHAR(SYSTIMESTAMP,'YYYY-MM-DDHH24:MI:SSXFP)TIME1,TO_CHAR(CURRENT_TIMESTAMP)TIME2FROMDUAL;

TIME1

TIME2

-----------------------------------------

2003-10-2410:48:45.656000

24-OCT-0310.48.45.656000AM+08:00

可以看到,毫秒在TO_CHAR中对应的是FF。

16.

用一个语句实现该需求:如果某条记录存在那么就执行更新操作,如果不存在那么就执行插入操作。正确答案:可以采用MERGE语句,但是只支持SELECT子查询。语法为

MERGEINTOTABLEUSINGDATA_SOURCEON(CONDITION)

WHENMATCHEDTHENUPDATE_CLAUSE

WHENNOTMATCHEDTHENINSERT_CLAUSE;

17.

如何实现分组取前3条记录?正确答案:可以利用分析函数,如获取每个部门薪水前三名的员工或每个班成绩前三名的学生,代码如下:

SELECT*FROM(SELECTDEPNO,ENAME,SAL,ROW_NUMBER()OVER(PARTITIONBYDEPNOORDERBYSALDESC)RNFROMEMP)WHERERN<=3;

18.

如何在SQL*Plus环境中执行OS命令?正确答案:可以使用host或!,如下:

SQL>hostlsntctlstart

在Unix/Linux平台下:

SQL>!<OScommand>

在Windows平台下还可以使用$,如下:

SQL>$<OScommand>

19.

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('

Hello

World

'):前后去掉空格,结果为“Hello

World”。

10)ltrim('

Hello

World

'):左边去掉空格,结果为“Hello

World

”。

11)rtrim('

Hello

World

'):右边去掉空格,结果为“Hello

World”。

12)lpad(salary,10,'*'):左补齐,结果为料*****24000。

13)rpad(salary,10,'*'):右补齐,结果为24000*****。

14)chr():将ASCII码转换为字符。

15)ascii():将字符转换为ASCII码。

20.

如何查看存储过程的编译错误?正确答案:在存储过程编译完成后使用SHOWERROR命令即可查看。

21.

如果查询的列中含有特殊字符,如通配符“%”与“_”,那么该如何查询这些特殊字符?正确答案:利用ESCAPE来查询,如下:

SELECT*FROMSCOTT.EMPWHERENAMELIKE'A\%'ESCAPE'\';

22.

如何插入单引号到数据库表中?正确答案:可以用ASCII码处理,其他特殊字符如&也一样,如下:

INSERTINTOTVALUES('I'||CHR(39)||'m');

--CHR(39)代表字符'

或者用两个单引号表示一个:

INSERTINTOTVALUES('I"m');

--两个"可以表示一个'

23.

十进制与十六进制如何转换?正确答案:十进制转换为十六进制用TO_CHAR:

SQL>SELECTTO_CHAR(100,'XX')COLAFROMDUAL;

COLA

-----

64

十六进制转换为十进制用TO_NUMBER:

SQL>SELECTTO_NUMBER('7D',

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论