简答题1. 如何实时查看日志输出?
在Linux中,可以使用命令“tail -f”来实时查看日志的输出。在Windows下也有tail.exe工具,直接复制到目录C:\Windows\System32下,然后直接输入命令“tail -f文件名”即可。
2. Oracle中哪个包可以获取环境变量的值?
可以通过DBMS_SYSTEM.GET_ENV来获取环境变量的当前生效值。
[考点] 系统包
3. 控制文件包含哪些基本内容?
控制文件主要包含如下条目,可以通过dump控制文件内容看到,命令为“alter system set events immediate trace name controlf level 12';”,也可以通过视图V$CONTROLFILE_RECORD_SECTION看到。
4. 什么是降序索引和升序索引?
对于升序索引(Ascending Indexes),数据库按升序排列的顺序存储数据。索引默认按照升序存储列值。默认情况下,字符数据按每个字节中包含的二进制值排序,数值数据按从小到大排序,日期数据从早到晚排序。
降序索引(Descending Indexes)将存储在一个特定的列或多列中的数据按降序排序。创建降序索引时使用DESC关键字,如下:
CREATE INDEX IND_DESC ON TESTDESC(ADESC,B ASC);
需要注意的是,降序索引在DBA_INDEXES的INDEX_TYPE列表现为FUNCTION-BASED即函数索引,但是在DBA_IND_EXPRESSIONS不能体现其升序或降序,只能通过视图DBA_IND_COLUMNS的DESCEND列来查询。
[考点] 分类
5. MySQL有哪几个默认数据库?
在MySQL中,数据库也可以称为Schema。在安装MySQL后,默认有information schema、mysql、performance_schema和sys这几个数据库,如下:
1.数据库information_schema
information_schema是信息数据库,是MySQL 5.0新增的一个数据库,其中保存着关于MySQL服务器所维护的所有其他数据库的信息。information_schema提供了访问数据库元数据的方式。元数据是关于数据的数据,例如,数据库名或表名、列的数据类型、访问权限等。information_schema是一个虚拟数据库,有数个只读表,它们实际上是视图,而不是基本表,因此,无法看到与之相关的任何文件。
2.数据库mysql
这个是MySQL的核心数据库,主要存储着数据库的用户、权限设置、MySQL自己需要使用的控制和管理信息。它不可以被删除,如果对MySQL不是很了解,那么也不要轻易修改这个数据库里面的表信息。
3.数据库performance_schema
这是从MySOL 5.5版本开始新增的一个数据库,主要用于收集数据库服务器性能数据,需要设置参数performance_schema才可以启动该功能。这个功能从MySQL 5.6.6开始,默认是开启的(在MySQL 5.6.6版本以下默认是关闭的),其值为1或ON表示启用,为0或OFF表示关闭。需要注意的是,该参数是静态参数,只能写在my.cnf中,不能动态修改。
4.数据库sys
MySOL 5.7提供了sys系统数据库。sys数据库结合了information_schema和performance_schema的相关数据,里面包含了一系列的存储过程、自定义函数以及视图来帮助DBA快速地了解系统的元数据信息,为DBA解决性能瓶颈提供了巨大帮助。sys数据库目前只包含一个表,表名为sys_config。
另外需要注意的一点是,在MySQL 5.7以前还存在一个默认的test库,用于测试,而在MySQL 5.7及其之后的版本中去掉了该库。
6. Oracle删除数据库的方式有哪几种?
有如下几种方式可以用来删除Oracle数据库:
1)直接在OS级别调用dbca命令以静默的方式删除数据库,如下所示,其中,mydb为数据库名:
dbca-silent-deleteDatabase-sourceDB mydb
2)SQL窗口:
ALTER DATABASE CLOSE;
ALTER SYSTEM ENABLE RESTRICTED SESSION;
DROP DATABASE;
或
STARTUP FORCE MOUNT RESTRICT;
DROP DATABASE;
注意:强烈推荐第1种方式,对于第2种方式,若是在RAC环境中,数据库需要设置参数CLUSTER_DATABASE为FALSE后才可以执行DROP DATABASE,设置的命令为ALTER SYSTEM SET CLUSTER_DATABASE=FALSE SID='*'SCOPE=SPFILE;。
[考点] 建库与删库
7. 数据的物理独立性和逻辑独立性分别指的是什么?
数据独立性表示应用程序与数据库中存储的数据不存在依赖关系,包括数据的物理独立性和数据的逻辑独立性。数据库管理系统的模式结构和二级映像功能保证了数据库中的数据具有很高的物理独立性和逻辑独立性。
物理独立性是指用户的应用程序与存储在磁盘上的数据库中数据是相互独立的。即:数据在磁盘上怎样存储由DBMS管理,用户程序不需要了解,应用程序要处理的只是数据的逻辑结构,这样当数据的物理存储改变了,应用程序不用改变。
逻辑独立性是指用户的应用程序与数据库的逻辑结构是相互独立的,即:当数据的逻辑结构改变时,用户程序也可以不变。
[考点] 数据库系统的组成与结构
8. 使用SCOTT/TIGER用户下的EMP表和DEPT表完成下列练习,表的结构说明如下:
EMP员工表(EMPNO员工号/ENAME员工姓名/JOB工作/MGR上级编号MIREDATE受雇日期/SAL薪金/COMM佣金/DEPTNO部门编号)
DEPT部门表(DEPTNO部门编号/DNAME部门名称/LOC地点)
工资=薪金+佣金
1)列出至少有一个员工的所有部门。
2)列出薪金比“SMITH”多的所有员工。
3)列出所有员工的姓名及其直接上级的姓名。
4)列出受雇日期早于其直接上级的所有员工。
5)列出部门名称和这些部门的员工信息,同时列出那些没有员工的部门。
6)列出所有工作为“CLERK”办事员的姓名及其部门名称。
7)列出最低薪金大于1500的各种工作。
8)列出在部门“SALES”销售部工作的员工的姓名,假定不知道销售部的部门编号。
9)列出薪金高于公司平均薪金的所有员工。
10)列出与员工“SCOTT”从事相同工作的所有员工。
11)列出薪金等于部门编号为30的员工的薪金的所有员工的姓名和薪金。
12)列出薪金高于在部门30工作的所有员工的薪金的员工姓名和薪金。
13)列出在每个部门工作的员工数量、平均工资和平均服务期限。
14)列出所有员工的姓名、部门名称和工资。
15)列出所有部门的详细信息和部门人数。
16)列出各种工作的最低工资。
17)列出工作为“MANAGER”的员工的最低薪金。
18)列出所有员工的年工资,按年薪从低到高排序。
本题考查编写SQL语句的能力,答案如下:
1)考查两个表联合查询,及GROUPBY...HAVING的用法,最终的SQL如下:
SELECT DNAME FROM SCOTT.DEPT T WHERE T.DEPTNO IN (SELECT T.DEPTNO FROM SCOTT.EMP GROUP BY T.DEPTNO HAVING COUNT(*)>1)
2)经典的自连接查询,最终的SQL如下:
SELECT ENAME FROM SCOTT.EMP T WHERE SAL>(SELECT SAL FROM SCOTT.EMP WHERE ENAME LIKE='SMITH);
3)多次对自己查询,为表取个别名,内部查询可以像对象一样引用外部的对象的字段,这里引用与编程中的作用域相似,即与{}类比,最终的SQL如下:
SELECT ENANE,(SELECT ENAME FROM SCOTT.EMP WHERE SCOTT.EMPNOIN(A.MGR)) FROM SCOTT.EMP A;
4)日期可直接用来比较,最终的SQL如下:
SELECT ENAME FROM SCOTT.EMP AWHERE HIREDATE<(SELECT HIREDATE FROM SCOTT.EMP WHERE SCOTT.EMPNO IN (A.MGR));
5)以SCOTT.DEPT表为主,左连接查询,最终的SQL如下:
SELECT DNAME, B.*FROM SCOTT.DEPTALEFT JOIN SCOTT.EMPB ON A.DEPTNO=B.DEPTNO;
6)最终的SQL如下:
SELECT ENAME,(SELECT DNAME FROM SCOTT.DEPT WHERE T.DEPTNO IN(A.DEPTNO))AS DNAME FROM SCOTT.EMP A WHERE JOB='CLERK';
7)找出哪些工作的所有员工的薪金都大于1500,最终的SQL如下:
SELECT T.JOB FROM SCOTT.SCOTT.EMP T GROUP BY T.JOB HAVING MIN(SAL)>1500;
8)经典的两个表连接,最终的SQL如下:
SELECT ENAME FROM SCOTT.EMP WHERE T.DEPTNO=(SELECT T.DEPTNO FROM SCOTT.DEPT WHERE DNAME='SALES');
9)反复查自己,最终的SQL如下:
SELECT ENAME FROM SCOTT.EMP WHERE SAL>(SELECT AVG(SAL) FROM SCOTT.EMP);
10)排除自己,最终的SQL如下:
SELECT ENAME FROM SCOTT.EMP WHERE JOB IN (SELECT JOB FROM SCOTT.EMP WHERE ENAME='SCOTT) AND ENAME !='SCOTT;
11)考查ANY的用法,且排除自己,最终的SQL如下:
SELECT ENAME, SAL FROM SCOTT.EMP WHERE SAL=ANY (SELECT SAL FROM SCOTT.EMP WHERET.DEPTNO=30) AND T.DEPTNO!=30;
12)MAX的用法,最终的SQL如下:
SELECT SAL, ENAME FROM SCOTT.EMP WHERE SAL>(SELECT MAX(SAL) FROM SCOTT.EMP WHERE T.DEPTNO=30);
13)经典的GROUP BY用法,最终的SQL如下:
SELECT T.DEPTNO, COUNT(*), AVG(A.SAL+COMM), AVG(SYSDATE-HIREDATE) FROM SCOIT.EMP A GROUP BY T.DEPTNO;
14)经典的两个表的连接查询,用具体的名称替换一个表中的主键的ID(解决很多人在实际运用中会遇到的不能绑定多列的问题),也可用WHERE来查询,与题5)比较,最终的SQL如下:
SELECT ENAME,SAL+COMM,(SELECT DNAME FROM SCOTT.DEPT A WHERE A.DEPTNO=B.DEPTNO) AS DNAME FROM SCOTT.EMP B;
15)因为使用了SELECT*,将显示SCOTT.DEPT和后面临时表B的全部字段(注意:不只是SCOTT.DEPT的字段,注意*号),最终的SQL如下:
SELECT * FROM SCOTT.DEPT A LEFT JOIN (SELECT DEPTNO, COUNT(*) FROM SCOTT.EMP GROUP BY DEPTNO) B ON A.DEPTNO=B.DEPTNO;
16)考查MIN的用法,最终的SQL如下:
SELECT JOB, MIN(SAL) FROM SCOTT.EMP GROUP BY JOB;
17)因为MANAGER是值而不是字段,所以不能用小写,最终的SQL如下:
SELECT MIN(SAL+COMM) FROM SCOTT.EMP WHERE JOB='MANAGER';
18)NVL:空转化函数。最终的SQL如下:
SELECT ENAME, (SAL+NVL(COMM,0))* 12 AS SAL FROM SCOTT.EMP ORDER BY SAL;
[考点] SQL编写
9. 创建GBK字符集的数据库NEWLHR,并查看已建库的完整语句。
10. 什么是ASSM和MSSM?PCTFREE和PCTUSED的作用是什么?
段空间有两种管理方式,分别是手动段空间管理(Manual Segment Space Management,MSSM)和自动段空间管理(Auto Segment Space Management,ASSM)。
自动段空间管理(ASSM),它首次出现在Oracle 9.2中。自由列表FREELIST被位图所取代,它是一个二进制的数组,能够迅速有效地管理存储扩展和剩余区块(Free Block),因此能够改善分段存储本质。ASSM会忽略PCTUSED参数而只使用PCTFREE参数。对于MSSM而言,可以设置FREELIST、PCTUSED和PCTFREE等参数来控制如何分配和使用段中的空间。
1.FREELIST(自由列表)
Oracle通过维护FREELIST列表来记录或更新所有可用的数据块。当执行INSERT语句时,Oracle首先在FREELIST列表上搜索可用的空闲数据块,搜索成功之后将数据插入那个空闲块。块在。FREELIST列表中的可用性由PCTFREE参数值来决定。起初一个空块在FREELIST列表上列出,并且会一直保留,直到空闲空间达到PCTFREE设定的值。当一个块被使用且达到PCTFREE设定的值之后,该块将从FREELIST列表移除,而当数据块的可用空间低于PCTUSED值的时候,该块又会回收,即重新回到FREELIST列表。Oracle使用FREELIST方式以提高数据库性能。因此,每一个INSERT操作,Oracle仅仅需要搜索FREELIST结构,而不是搜索所有数据块。从Oracle 9i开始,引入了ASSM,它让Oracle自动管理FREELIST。在ASSM里,Oracle使用位图方式来标记数据块是否可用,这种数据块的空间管理方式比用一个列表来管理效率更高。
2.PCTFREE(空闲率)和PCTUSED(使用率)
PCTFREE和PCTUSED这两个参数是面试中常问到的概念。它们用来优化数据块空间的使用,控制数据块是否出现在FREELIST中。当创建或者更改任何表和索引的时候,Oracle在空间控制方面使用这两个存储参数。
1)PCTFREE:块中保留用于UPDATE操作的空间百分比,当数据占用的空间达到此上限时,新的数据将不能再插入此块中。当数据块中的FREE空间小于PCTFREE设置的空间时,该数据块从FREELIST中去掉,当块由于DML操作FREE空间大于PCTUSED设置的空间时,该数据库块将被添加在FREELIST链表中。对于表和索引来说,该值默认为10%,通过查询DBA_TABLES或DBA_INDEXES视图的PCT_FREE列可以获取到该属性的值。该值适用于MSSM和ASSM。
2)PCTUSED:指定块中数据使用空间的最低百分比;用于为插入一新行数据的最小空间的百分比。这个值决定了块的可用状态。可用状态的块可以执行插入操作,不可用状态的块只能执行删除和修改,可用状态的块被放在FREELIST中。该值只针对表有效,默认值为40%,通过查询DBA_TABLES视图的PCT_USED列可以获取到该属性的值。该值仅适用于MSSM。
若要修改表的PCTFREE和PCTUSED的值,可以使用ALTER语句修改。需要注意的是,修改之后只对新块起作用,若要对表中原有的块起作用,则可以使用MOVE重新组织表,SQL语句如下:
ALTER TABLE T_TEST_LHR PCTFREE 20;
ALTER TABLE T_TEST_LHR MOVE;
若要修改索引的PCTFREE的值,可以使用如下的SQL语句:
ALTER INDEX PK_TEST_LHR REBUILD PCTFREE 20;
[考点] 逻辑结构
11. 分区表常用数据字典视图有哪些?
Oracle分区表相关数据字典视图如下:
1)显示数据库所有分区表的信息:DBA PART TABLES。
2)显示表分区信息,显示数据库所有分区表的详细分区信息:DBA_TAB_PARTITIONS。
3)显示子分区信息,显示数据库所有复合分区表的子分区信息:DBA_TAB_SUBPARTITIONS。
4)显示分区列,显示数据库所有分区表的分区列信息:DBA_PART_KEY_COLUMNS。
5)显示子分区列,显示数据库所有分区表的子分区列信息:DBA_SUBPART_KEY_COLUMNS。
[考点] 分区表
12. 分布式数据库与并行数据库有哪些不同点?
分布式数据库与并行数据库的不同点如下:
1)应用目标不同。并行数据库系统的目标是充分发挥并行计算机的优势,利用系统中的各个处理机节点并行完成数据库任务,提高数据库系统的整体性能。分布式数据库系统的主要目的在于实现场地自治和数据的全局透明共享,而不要求利用网络中的各个节点来提高系统处理性能。
2)实现方式不同。在具体实现方法上,并行数据库系统与分布式数据库系统也有着较大的不同。在并行数据库系统中,为了充分利用各个节点的处理能力,各节点间可以采用高速网络连接。节点间的数据传输代价相对较低,当某些节点处于空闲状态时,可以将工作负载过大的节点上的部分任务通过高速网传送给空闲节点处理,从而实现系统的负载平衡。
在分布式数据库系统中,为了适应应用的需要,各节点间一般采用局域网或广域网相连,网络带宽较低,点到点的通信开销较大。因此,在查询处理时一般应尽量减少节点间的数据传输量。
3)各节点的地位不同。在并行数据库系统中,各节点是完全非独立的,不存在全局应用和局部应用的概念,在数据处理中只能发挥协同作用,而不能有局部应用。在分布式数据库系统中,各节点除了能通过网络协同完成全局事务外,各节点具有场地自治性,每个场地都是独立的数据库系统,每个场地都有自己的数据库、客户、CPU等资源,运行自己的DBMS,执行局部应用,具有高度的自治性。
[考点] 分布式数据库与并行数据库
13. 什么是反连接(Anti Join)?
反连接(Anti Join)也是一种特殊的连接类型,通常用于从一个表中返回不在另一个数据源中的数据行。当做子查询展开时,Oracle经常会把那些外部WHERE条件为NOT EXISTS、NOT IN或<>ALL的子查询转换成对应的反连接。反连接分为嵌套循环反连接(NESTED LOOPS ANTI,Hint为NL_AJ)、排序合并反连接(MERGE JOIN ANTI,Hint为MERGE_AJ)和哈希反连接(HASH JOIN ANTI,Hint为HASH_AJ)。
需要注意的是,NOT IN和<>ALL对NULL值敏感,这意味着NOT IN后面的子查询或者常量集合一旦有NULL值出现,则整个SQL的执行结果就会为NULL,即此时的执行结果将不包含任何记录。但是,NOT EXISTS对NULL值不敏感,这意味着NULL值对NOT EXISTS的执行结果不会有什么影响。正是因为NOTIN和<>ALL对NULL值敏感,所以一旦相关的连接列上出现了NULL值,此时Oracle如果还按照通常的反连接的处理逻辑来处理,得到的结果就不对了。为了解决NOT IN和<>ALL对NULL值敏感的问题,Oracle推出了改良的反连接,这种反连接能够处理NULL值,Oracle称其为Null-Aware Anti Join,如下例:
执行步骤的列Operation的值为“HASH JOIN ANTINA”,关键字“NA”就是Null-Aware的缩写,表示这里采用的不是普通的哈希反连接,而是改良后的、能够处理NULL值的哈希反连接。
在Oracle 11gR2中,Oracle是否启用Null-Aware Anti Join受隐含参数“_OPTIMIZER_NULL_AWARE_ANTIJOIN”控制,其默认值为TRUE,表示启用Null-Aware Anti Join。如果把该参数的值修改为FALSE,那么表示Oracle就不能再用Null-Aware Anti Join了,而又因为NOT IN对NULL值敏感,所以Oracle此时也不能用普通的反连接。
[考点] SQL优化
14. 数据库设计过程的输入和输出有哪些内容?
数据库设计过程的输入包括四部分内容:①总体信息需求;②处理需求;③DBMS的特征;④硬件和OS(操作系统)特征。
数据库设计过程的输出包括两部分:
1)完整的数据库结构,包括逻辑结构和物理结构。
2)基于数据库结构和处理需求的应用程序的设计原则。这些输出一般以说明书的形式出现。
[考点] 数据库系统的组成与结构
15. SQL语句的执行过程有哪些?
Oracle数据库里SQL语句的执行过程可以如下图所示。
在上图中,可以看到SQL语句的执行过程大致分为以下几个步骤:
1)当用户提交待执行的目标SQL后,Oracle首先会对目标SQL进行解析。在这个过程中,Oracle会先执行对目标SQL的语法、语义和权限的检查:
①语法检查(Syntax Check)是检查目标SQL的拼写是否正确,例如,错将关键字“FROM”写成“FORM”,将“SELECT”写成“SELET”等。
②语义检查(Semantic Check)是检查SQL语句中的访问对象是否存在及该用户是否具备相应的权限。
2)如果目标SQL不能通过上述语法、语义和权限的检查,那么该目标SQL将解析失败。如果目标SQL能通过上述检查,那么接下来Oracle就会去SGA的共享池中的库缓存中查找是否存在匹配的共享游标。如果找到了匹配的共享游标,那么Oracle就会把存储于该共享游标中的解析树和执行计划直接拿过来重用,这相当于跳过了后续的“查询转换”和“查询优化”这两个步骤,直接进入“实际执行”阶段。
3)如果找不到匹配的共享游标,就意味着此时没有可以被重用的解析树和执行计划,那么接下来整个执行过程就进入查询转换这一步。在查询转换过程中,Oracle会根据一些规则来决定是否对目标SQL执行查询转换,这些规则在Oracle不同的版本里不尽相同。在Oracle 9i中,查询转换是独立于优化器的,它与优化器的类型无关,但是从Oracle 10g开始,0racle会对某些类型的查询转换(比如子查询展开、复杂视图合并等)分别计算经过查询转换后的等价改写SQL的成本和原始SQL的成本。只有当等价改写后SQL的成本值小于未经过查询转换的原始SQL的成本值时,Oracle才会对目标SQL执行查询转换。在执行完查询转换后,原目标SQL可能就被Oracle改写了,当然也有可能没有改写。
4)接下来,Oracle就正式进入了查询优化这个步骤。在这个步骤里,Oracle会根据不同的优化器类型(CBO或RBO)采用不同的判断原则,从执行完查询转换后得到的目标SQL的诸多可能的执行路径中选择一条效率最高的路径来作为其执行计划,即查询优化的输入就是执行完查询转换后得到的等价改写SQL,其输出就是该目标SQL的最终执行计划。
5)在得到了目标SQL的执行计划后,接下来Oracle就会根据执行计划去实际执行该SQL,并将执行结果返回给用户。
[考点] 游标
16. MVCC的含义是什么?
在多用户的系统里,假设有多个用户同时读写数据库里的一行记录,那么怎么保证数据的一致性呢?一种基本的解决方法是对这一行记录加上一把锁,将不同用户对同一行记录的读写操作完全串行化执行,由于同一时刻只有一个用户在操作,因此一致性不存在问题。但是,它存在明显的性能问题:读会阻塞写,写也会阻塞读,整个数据库系统的并发性能将大打折扣。
MVCC(Multi-Version Concurrent Control,多版本并发控制)的目标是在保证数据一致性的前提下,提供一种高并发的访问性能。在MVCC协议中,每个用户在连接数据库时看到的是一个具有一致性状态的镜像,每个事务在提交到数据库之前对其他用户均是不可见的。当事务需要更新数据时,不会直接覆盖以前的数据,而是生成一个新的版本的数据,因此一条数据会有多个版本存储,但是同一时刻只有最新的版本号是有效的。因此,读的时候就可以保证总是以当前时刻的版本的数据可以被读到,不论这条数据后来是否被修改或删除。
大多数的MySQL事务型存储引擎,例如InnoDB、Falcon以及PBXT都不使用简单的行锁机制,它们都和MVCC机制来一起使用。MVCC不只使用在MySQL中,Oracle、PostgreSQL以及其他一些数据库系统也同样使用它。
可以将MVCC看成行级锁的一种妥协,它在许多情况下避免了使用锁,同时可以提供更小的开销。根据实现的不同,它可以允许非阻塞读,在写操作进行时,只锁定需要的记录。MVCC会保存某个时间点上的数据快照,这意味着事务可以看到一个一致的数据视图,而不管它们需要运行多久。这同时也意味着不同的事务在同一个时间点看到的同一个表的数据可能是不同的。
使用MVCC多版本并发控制相比锁定模型的主要优点是,在MVCC里,对检索(读)数据的锁要求与写数据的锁要求不冲突,所以,读不会阻塞写,而写也从不阻塞读。在数据库里也有表和行级别的锁定机制,用于给那些无法轻松接受MVCC行为的应用。不过,恰当地使用MVCC总会提供比锁更好的性能。
17. 如何查找最近1min内,最消耗CPU的SQL语句及会话信息?
最消耗CPU的SQL语句可以根据V$ACTIVE_SESSION_HISTORY视图来获取,取“SESSION_STATE='ON CPU'”,若查询最消耗I/O的SQL语句则可以取“WAIT_CLASS='USER I/O'”。
[考点] 性能诊断
18. Oracle的异常可以分为哪几类?
Oracle将异常分为预定义异常、非预定义异常和自定义异常三种。
1.预定义异常(Predefined)
当PL/SQL应用程序违反了Oracle规定的限制时,就会隐含地触发一个内部异常,这就是预定义异常。预定义异常用于处理常见的Oracle错误,对这种异常情况的处理,无须在程序中定义,由Oracle自动将其触发。它们全部放在PL/SQL自带的标准包中,这样程序员就无须再次定义了。预定义异常大约有20多个,下表是一些常见的预定义异常。
错误号
|
异常错误信息名称
|
说明
|
ORA-01403
|
NO_DATA_FOUND
|
SELECT INTO没有找到数据
|
ORA-01422
|
TOO_MANY_ROWS
|
SELECT INTO返回多行
|
ORA-06501
|
PROGRAM_ERROR
|
内部错误,需重新安装数据字典视图和PL/SQL包
|
ORA-06511
|
CURSOR_ALREADY_OPEN
|
试图打开一个已存在的游标
|
ORA-06530
|
ACCESS_INTO_NULL
|
试图为NULL对象的属性赋值
|
ORA-01012
|
NOT_LOGGED_ON
|
没有连接到Oracle
|
ORA-01001
|
INVALID_CURSOR
|
试图使用一个无效的游标
|
ORA-00061
|
TRANSACTION_BACKED_OUT
|
由于发生死锁事务被撤销
|
ORA-00051
|
TIMEOUT_ON_RESOURCE
|
在等待资源时发生超时
|
ORA-00001
|
DUP_VAL_ON_INDEX
|
试图破坏一个唯一性限制
|
ORA-01017
|
LOGIN_DENIED
|
无效的用户名/口令
|
ORA-01476
|
ZERO_DIVIDE
|
试图被零除
|
ORA-01722
|
INVALID_NUMBER
|
转换一个数字失败
|
ORA-06500
|
STORAGE_ERROR
|
内存不够或内存被破坏触发的内部错误
|
ORA-06502
|
VALUE_ERROR
|
赋值操作,变量长度不足,触发该异常
|
ORA-06504
|
ROWTYPE_MISMATCH
|
宿主游标变量与PL/SQL变量有不兼容行类型
|
ORA-06531
|
COLLECTION_IS_NULL
|
试图给没有初始化的嵌套表变量或者VARRY变量赋值
|
ORA-06532
|
SUBSCRIP_OUTSIDE_LIMIT
|
对嵌套或VARRAY索引使用了负数
|
ORA-06533
|
SUBSCRIPT_BEYOND_COUNT
|
对嵌套或VARRAY索引的引用大于集合中元素的个数
|
2.非预定义异常(Non Predefined)
非预定义异常用于处理预定义异常不能处理的异常,即其他标准的Oracle错误。使用预定义异常只能处理系统预定义的20多个Oracle错误,而当使用PL/SQL开发应用程序时,可能会遇到其他的一些Oracle错误。例如,在PL/SQL块中执行DML语句时违反了约束规定等。在这样的情况下,就可以使用非预定义异常来处理。
Oracle提供了2个函数SQLCODE和SQLERRM用于返回错误信息。
1)SQLCODE:返回错误代码。
2)SQLERRM:返回与错误代码关联的消息。
这样就可以在错误日志表中记录程序在执行过程中发生的错误信息了。
3.自定义异常(User_define)
自定义异常用于处理与Oracle错误无关的其他情况。对这种异常情况的处理,需要用户在程序中定义,然后显式地在程序中将其触发。
预定义异常和自定义异常都是与Oracle错误相关的,并且出现的Oracle错误会隐含地触发相应的异常;而自定义异常与Oracle错误没有任何关联,它是由开发人员为特定情况所定义的异常。当与一个异常相关的错误出现时,就会隐含触发该异常。用户定义异常是通过显式使用RAISE语句来触发。当触发一个异常时,控制程序就转到异常块部分,执行错误处理代码。
[考点] 程序处理
19. 什么叫数据抽象?试举例说明。
数据抽象是对实际的人、物、事和概念进行人为处理,抽取所关心的共同特性,忽略非本质的细节,并把这些特性用各种概念精确地加以描述,这些概念组成了某种模型。例如,在学校环境中,李英是老师,表示李英是教师类型中的一员,则教师是实体型,李英是教师实体型中的一个实体值,具有教师共同的特性和行为,在某个系某个专业教学,讲授某些课程,从事某个方向的科研。
[考点] 数据库系统的组成与结构