♣
题目 部分
在Oracle中,什么是DUAL表?
♣
答案部分
有关Oracle的DUAL表,需要掌握以下几点内容:
① 系统提供的一个DUMMY表,临时显示结果的表,里边的内容没有特定的意义,就是为了存在而存在。
② DUAL是属于SYS用户的一个表,然后以公共同义词的方式供其他数据库用户使用,这一点可以由以下SQL验证:
1SELECT D.OWNER,D.OBJECT_NAME,D.OBJECT_ID,D.OBJECT_TYPE FROM DBA_OBJECTS D WHERE D.OBJECT_NAME='DUAL';
③ Oracle对DUAL表的操作做了一些内部处理,尽量保证DUAL表中只返回一条记录。当然这些内部操作是不可见的。
④ 若DUAL表出现问题,则所有相关的基础操作都会受到影响;若DUAL表被删除的话,则数据库将不能启动,报ORA-01775的错误。
⑤ DUAL在数据库OPEN状态下是一行一列的表,但是在MOUNT和NOMOUNT状态下是一行四列的表。
⑥ DUAL的常用方式如下所示:
a. 查看当前连接用户 SELECT USER FROM DUAL;
b. 查看当前日期、时间 SELECT TO_CHAR(SYSDATE,'YYYY-MM-DD HH24:MI:SS') FROM DUAL;
c. 当作计算器用 SELECT 8*9 FROM DUAL;
d. 查看序列值 SELECT MYSEQ.NEXTVAL FROM DUAL;
需要注意的是,如果DUAL被删除的话,那么总体的恢复思路是在数据库OPEN的情况下重建DUAL表,重建的语句如下所示:
1CREATE TABLE SYS.DUAL(DUMMY VARCHAR2(1)) STORAGE(INITIAL 1) TABLESPACE SYSTEM; 2INSERT INTO DUAL VALUES('X'); 3COMMIT; 4CREATE OR REPLACE PUBLIC SYNONYM DUAL FOR DUAL; 5GRANT SELECT ON DUAL TO PUBLIC WITH GRANT OPTION; 6@?/rdbms/admin/utlrp.sql
如果是DUAL被删除后重启了数据库,那么就需要设置参数REPLICATION_DEPENDENCY_TRACKING为FALSE才能启动数据库。