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

下载本文档

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

文档简介

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

PL/SQL中的%ROWTYPE和%TYPE的区别是什么?正确答案:%TYPE是定义一个变量,其数据类型与已经定义的某个数据变量的类型相同,或者与数据库表的(江南博哥)某个列的数据类型相同。[解析]关于%ROWTYPE,需要了解以下内容:

1)%ROWTYPE返回的是一个记录类型,其数据类型和数据库表的数据结构一致。

2)声明的变量对应于数据库表或视图中列的集合。

3)在%ROWTYPE之前加上数据库表名。

4)记录内字段名和数据类型与参照表或视图中的列相同。

具体而言,%ROWTYPE有如下优点:

1)可以不必知道数据库中列的数量和类型。

2)在运行期间,数据库中列的数量和类型可能发生变化,但是却不用修改代码。

3)在SELECT语句中使用该属性可以有效地检索表中的行。

2.

使用哪个数据字典可以查询序列的定义信息?正确答案:可以通过查询数据字典视图DBA_SEQUENCES获取序列的定义信息,NEXTVAL返回序列中下一个有效的值,任何用户都可以引用CURRVAL中存放的序列的当前值。当序列值不符合实际需求时,可以执行ALTERSEQUENCE命令修改序列,需要注意的是,启动序列号不可以修改(STARTWITHN)。修改序列的语法和序列的创建语法一样,只是将CREATE修改为ALTER即可。

3.

同义词的定义及其作用是什么?正确答案:同义词是其他对象(例如表、实体、存储过程、函数、包、序列)的别名。同义词也可以是

另一个同义词的别名。同义词的优点主要体现在以下几个方面:

1)当使用对象时,不需要指出对象的所有者。

2)引用对象不需要指出它所在的数据库。

创建同义词必须要有CREATEANYSYNONYM、CREATESYNONYM系统权限。要创建全局的同义词,必须有CREATEPUBLICSYNONYN系统权限。创建同义词的语法如下:

CREATEORREPLACE[PUBLIC]SYNONYM同义词名称FOR用户名,表名称;

4.

当DML语句中有一条数据报错时,如何让该DML语句继续执行?正确答案:当一个DML语句运行的时候,如果遇到了错误,那么这条语句会进行回滚,就好像没有执行过。对于一个大的DML语句而言,如果个别数据错误而导致整个语句的回滚,那么会浪费很多的资源和运行时间。所以,从Oracle10g开始Oracle支持记录DML语句的错误,而允许语句自动继续执行。这个功能可以使用DBMSERRLOG包实现。

利用CREATEERRORLOG来创建T1表的DML错误记录表:

可以看到,插入成功执行,但是插入记录为0条。对应的错误信息表中已经包含了插入的信息。而且从错误信息表中还可以看到对应的错误号和详细错误信息,ORA_ERR_OPTYP$为错误操作类型,I表示为INSERT。

关于LOGERRORS的语法为,INTO语句后面跟随的就是指定的错误记录表的表名。在INTO语句后面,可以跟随一个表达式“('T1_ERRLOG_LHR')”即ORA_ERR_TAG$中存储的信息,用来设置本次语句执行的错误在错误记录表中对应的TAG。有了这个语句,就可以很轻易地在错误记录表中找到某次操作所对应的所有的错误,这对于错误记录表中包含了大量数据,且本次语句产生了多条错误信息的情况十分有帮助。只要这个表达式的值可以转化为字符串类型就可以。REJECTLIMIT则限制语句出错的数量。

LHR@orclasm>INSERTINTOT1SELECT*FROMT2LOGERRORSINTOT1_ERRLOG('T1_ERRLOG')REJECTLIMIT1;

INSERTINTOT1SELECT*FROMT2LOGERRORSINTOT1_ERRLOG('T1_ERRLOG')REJECTLIMIT1

*

ERRORatline1:

ORA-00001:uniqueconstraint(LHR.PK_T1_A)violated

可以看到,当设置的REJECTLIMIT的值小于出错记录数时,语句会报错,这时LOGERRORS语句没有起到应有的作用,插入语句仍然以报错结束。而如果将REJECTLIMIT的限制设置大于等于出错的记录数,则插入语句就会执行成功,而所有出错的信息都会存储到LOGERRORS对应的表中。只要指定了LOGERRORS语句,不管最终插入语句是否成功地执行完成,在错误记录表中都会记录语句执行过程中遇到的错误。比如第一个插入由于出错数目超过REJECTLIMIT的限制,这时在记录表中会存在REJECTLIMIT+1条记录数,因此这条记录错误导致了整个SQL语句的报错。如果不管碰到多少错误,都希望语句能继续执行,那么可以设置REJECTLIMIT为UNLIMITED。需要注意的是,即使做了回滚操作,错误日志表中的记录并不会减少,因为Oracle是利用自治事务的方式插入错误记录表的。

LOGERRORS可以用在INSERT、UPDATE、DELETE和MERGE后,但是,它有以下限制条件:

1)违反延迟约束。

2)直接路径的INSERT或MERGE语句违反了唯一约束或唯一索引(注意:从Oracle11g开始,已经取消了该条限制)。

3)更新操作违反了唯一约束或唯一索引。

4)错误日志表的列不支持的数据类型包括LONG、LONGRAW、BLOG、CLOB、NCLOB、BFILE以及各种对象类型。Oracle不支持这些类型的原因也很简单,这些特殊的类型不是包含了大量的记录,就是需要通过特殊的方法来读取,因此Oracle没有办法在SQL处理的时候将对应列的信息写到错误记录表中。

5.

什么是临时表?正确答案:在创建数据表的时候,如果没有特殊的指明,那么创建的表是一个永久的关系型表,也就是说,这个表中对应的数据,除非是显式地删除,否则表中的数据是永远都存在的。相对应的,在Oracle数据库中,还有一种类型的表,叫作临时表。这个临时表与永久表最大的区别就是表中的数据不会永远地存在。当一个会话结束或者事务结束的时候,这个临时表中的数据,不用用户自己删除,数据库自己会自动清除。

Oracle的临时表创建之后基本不占用表空间,如果没有指定临时表(包括临时表的索引)存放的表空间,那么插入临时表的数据是存放在Oracle系统的默认临时表空间中(TEMP),一个系统可能有多个临时表空间。临时表的数据只能存放在临时表空间中。

临时表的数据只是在事务期间存在,对于会话类型的临时表,数据在会话期间存在,会话的数据对于当前会话私有,每个会话只能看到并修改自己的数据。DML锁不会加到临时表的数据上。可以对临时表创建索引、视图、触发器,可以用exp和imp工具导入导出表的定义,但是不能导出数据。[考点]对象

6.

临时表的特点有哪些?正确答案:临时表的特点有如下几点:

1)多用户操作的独立性。对于使用同一张临时表的不同用户,Oracle都会分配一个独立的TEMPSEGMENT,这样避免了多个用户在对同一张临时表操作时发生交叉,从而保证了多个用户操作的并发性和独立性。

2)数据的临时性。既然是临时表,顾名思义,存放在该表中的数据是临时性的。Oracle根据创建临时表时指定的参数(ONCOMMITDELETEROWS/ONCOMMITPRESERVEROWS),自动将数据TRUNCATE掉。[考点]对象

7.

Oracle有哪几种临时表?正确答案:Oracle数据库根据临时表的性质不同,可以分为事务临时表(ONCOMMITDELETEROWS)与会话临时表(ONCOMMITPRESERVEROWS)。

事务临时表是指数据只在当前事务内有效,该临时表与事务相关,当进行事务提交或者事务回滚的时候,临时表中的数据将自动被清空,其他的内容和会话级的临时表的一致(包括退出SESSION的时候,事务级的临时表的数据也会被清空)。一般情况下,如果在创建数据表的时候,没有特殊指咀表是会话临时表,那么该表默认为事务临时表。事务临时表中的数据被清空的情况包括提交事务(COMMIT)、回滚事务(ROLLBACK)以及退出SESSION。

会话临时表,顾名思义,是指数据只在当前会话内是有效的临时表。关闭当前会话或者进行新的连接之后,数据表中的内容就会被清除。

会话临时表与事务临时表主要的差异就在于删除数据的时机不同。事务临时表是在事务提交或回滚的时候清除数据,而会话临时表则是在关闭当前会话的时候清除数据。只要当前会话没有关闭,即使事务完成了,会话临时表中的数据仍然存在,不会被清除。[考点]对象

8.

如何判断某张表是否是临时表?正确答案:查看一张表是否临时表,可以从DBA_TABLES视图的DURATION列来查询:

[考点]对象

9.

默认情况下,Oracle是否会收集临时表的统计信息?正确答案:临时表默认是不收集统计信息的,但是可以使用DBMS_STATS.GATHER_SCHEMA_STATS在SCHEMA级别收集,需要设置GATHER_TEMP为TRUE(默认为FALSE);也可以和普通表一样使用GATHER_TABLE_STATS在表级别来收集。需要注意的是,只能收集会话临时表的统计信息,不能收集事务临时表的统计信息。会话临时表的统计信息是被所有的会话所共享的,所以,在一般情况下,不建议收集临时表的统计信息,否则可能会导致很严重的数据库性能问题。临时表的统计信息在生成执行计划时一般是被动态采样的。[考点]对象

10.

什么是OracleDirectory?正确答案:OracleDirectory可以让用户在Oracle数据库中灵活地对文件进行读写操作,极大地提高了Oracle的易用性和可扩展性。[考点]对象

11.

Oracle的DBLINK是什么?正确答案:当用户要跨本地数据库访问另外一个数据库表中的数据时,本地数据库中必须创建了远程数据库的DBLINK,通过DBLINK可以像访问本地数据库一样访问远程数据库表中的数据。其实,DBLINK和数据库中的VIEW差不多,创建DBLINK的时候需要知道待读取数据库的IP地址、ORACLE_SID以及数据库用户名和密码。

在创建DBLINK之前,普通用户必须具有相关的权限才能创建DBLINK,以SYS用户登录到本地数据库可以看到相关的权限:

SELECT*FROMUSER_SYS_PRIVSTWHERET.PRIVILEGELIKEUPPER('%LINK%');

可以看出,在数据库中DBLINK有3种权限:CREATEDATABASELINK(所创建的DBLINK只能是创建者自己使用,其他用户不能使用)、CREATEPUBLICDATABASELINK(PUBLIC表示所创建的DBLINK所有用户都可以使用)与DROPPUBLICDATABAsELINK(删除公共的DBLINK)。可以使用如下授权语句给用户SCOTT授予CREATEPUBLICDATABASELINK和DROPPUBLICDATABASELINK两个权限:

GRANTCREATEPUBLICDATABASELINK,DROPPUBLICDATABASELINKTOSCOTT;

查询数据库的DBLINK可以使用SQL语句:SELECT*FROMDBA_DB_LINKS。[考点]对象

12.

Oracle的表可以分为哪几类?正确答案:从理论上来讲,不存在一种能够满足所有读取要求的数据存储方式,所以,Oracle设计了大约5种数据的存储格式,详见下表。

从上表中可以看出,没有最好的技术,只有最合适的技术。[考点]对象

13.

给出两种检查表结构的方法。正确答案:①DESCRIBE命令(平时用DESC即可);②DBMS_METADATA.GET_DDL包。[考点]对象

14.

Oracle中哪个包用于生成随机值?正确答案:DBMS_RANDOM是一个可以生成随机数值或者随机字符串的程序包。这个包有INITIALIZE()、SEED()、TERMINATE()、VALUE()、NORMAL()、RANDOM()、STRING()等几个函数,它们提供了内置的随机数生成器,可以用于快速生成随机数。[考点]系统包

15.

Oracle中哪个包可以获取环境变量的值?正确答案:可以通过DBMS_SYSTEM.GET_ENV来获取环境变量的当前生效值。[考点]系统包

16.

如何让程序等待60s后继续运行?_正确答案:可以执行$ORACLE_HOME/rdbms/admin/dbmslock.sql来创建DBMS_LOCK包,该包可以实现让程序暂时等待的功能。若想普通用户使用该包,则需要在SYS用户下执行“GRANTEXECUTEONDBMS_LOCKTOUSER_XXX;”命令。[考点]系统包

17.

Oracle使用哪个包可以生成并传递数据库告警信息?正确答案:DBMS_ALERT包用于生成并传递数据库告警信息。若想使用DBMS_ALERT包,则必须以SYS登录,为普通用户授予执行权限。DBMS_ALERT能让数据库触发器在特定的数据库值发生变化时向应用程序发送报警。报警是基于事务的并且是异步的(也就是它们的操作与定时机制无关)。[考点]系统包

18.

程序包DBMS_APPLICATION_INFO.READ_MODULE的作用是什么?正确答案:DBMS_APPLICATION_INFO是一个非常有用的程序包,它提供了通过V$SESSION跟踪脚本运行情况的能力,该包可以填充V$SESSION中的CLIENT_INFO、MODULE和ACTION这3列的值。在CLIENT_INFO列中存放程序的客户端信息;MODULE列存放主程序名,如包的名称;ACTION列存放程序包中的过程名。该包不仅提供了设置这些列值的过程,还提供了返回这些列值的过程。主要有如下的存储过程:

1)DBMS_APPLICATION_INFO.SET_CLIENT_INFO:填充V$SESSION视图的CLIENT_INFO列,记录客户端的信息,这里可以记录客户端的IP地址。

2)DBMS_APPLICATION_INFO.SET_MODULE:填充V$SESSION视图的MODULE列,记录主程序名。

3)DBMS_APPLICATION_INFO.READ_CLIENT_INFO:从V$SESSION中读取客户端的信息。

4)DBMS_APPLICATION_INFO.READ_MODULE:从V$SESSION中读取主程序的名称。[考点]系统包

19.

如何填充V$SESSION的CLIENT_INTO列和CLIENT_IDENTIFIER列?正确答案:V$SESSION的CLIENT_INFO列和CLIENT_IDENTIFIER列往往为空,所以需要写登录触发器,然后在触发器中使用如下的存储过程记录这2列的值:

BEGIN

DBMS_APPLICATION_INFO.SET_CLIENT_INFO(SYS_CONTEXT('USERENV','IF_ADDRESS'));

DBMS_SESSION.SET_IDENTIFIER(SYS_CONTEXT('USERENV','HOST'));

END;[考点]系统包

20.

ORA_ROWSCN函数的作用是什么?正确答案:对于每一行数据,ORA_ROWSCN返回每一行最近被修改的大概时间,可用于查询表最后一次被执行DML操作的时间。由于Oracle通过事务提交对行所在数据块来进行SCN(SystemChangeNumber,系统改变号,一个由系统内部维护的序列号。当系统需要更新的时候自动增加,它是系统中维持数据的一致性和顺序恢复的重要标志)的跟踪,所以,它不精确。可以通过在创建表时使用行级别的依赖跟踪来获得一个更加精确的SCN。

在对视图进行查询时,不能使用ORA_ROWSCN函数,但对于视图的基表是可以使用ORA_ROWSCN函数的,也能在UPDATE或DELETE语句的WHERE子句中使用ORA_ROWSCN函数。ORA_RO

温馨提示

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

评论

0/150

提交评论