ORACLE中DUAL表的使用汇总

经常在程序里看到“select sysdate from dual;”查了一下关于DUAL表的资料:
1. Dual 是什么?
select owner,object_name ,object_type from dba_objects where object_name =’DUAL’
结果:
OWNER OBJECT_NAME OBJECT_TYPE
———– ——————- ——————
SYS DUAL TABLE
PUBLIC DUAL SYNONYM
可以看出 DUAL是 SYS用户的一个TABLE.
Dual是Oracle中的一个实际存在的表,任何用户均可读取,常用在没有目标表的Select语句块中,用来构成select的语法规则,oracle保证dual里面永远只有一条记录。
2. 它有那些FIELD?
SQL> desc dual
Name Type Nullable Default Comments
—– ———– ——– ——- ——–
DUMMY VARCHAR2(1) Y
它只有一个 DUMMY Field.
3. DUAL 能做什么?
3.1 查找当天日期
SQL> select sysdate from dual;
SYSDATE
———–
2004-4-13
3.2 查找当前日期的当月第一天
SQL> select trunc(sysdate,’MONTH’) from dual;
TRUNC(SYSDATE,’MONTH’)
———————-
2004-4-1
3.3 查找当前日期的当月最后一天
SQL> select trunc(last_day(sysdate)) from dual;
TRUNC(LAST_DAY(SYSDATE))
————————
2004-4-30
4. DUAL奇妙现象
插入一条数据
SQL> insert into sys.dual values (‘V’);
1 row inserted
SQL> commit;
Commit complete
查看记录数
SQL> select count(1) from dual;
COUNT(1)
———-
2
查询记录
SQL> select * from dual;
DUMMY
—–
X
V
删除记录
SQL> delete from dual;
1 row deleted
为什么这样删除只能删除一条记录呢? 刚才不是查找出2条吗?
再次查询记录
SQL> select * from dual;
DUMMY
—–
V
删除的记录不是插入的记录.
关于这个现象,Oracle 解释是: DUAL should ALWAYS have 1 and only 1 row!
5.Dual的另一应用
Dual has another use when you try to test if you are connected with the DB remotely by JDBC in your AS such as Weblogic. This is a common table for any schema.
原先取系统时间,可以是select sysdate from 随便某个表,这样会有些隐患,如果该表被删除了,就会出异常,而从Dual表中获取就不会了。
select sysdate from dual!

以下是dual的一些使用方法:
1、查看当前用户,可以在SQL Plus中执行下面语句
select user from dual;
SQL> select user from dual;
USER
——————————
SYSTEM
2、用来调用系统函数
select to_char(sysdate,’yyyy-mm-dd hh24:mi:ss’) from dual;–获得当前系统时间
select SYS_CONTEXT(‘USERENV’,’TERMINAL’) from dual;–获得主机名
select SYS_CONTEXT(‘USERENV’,’language’) from dual;–获得当前locale
select dbms_random.random from dual;–获得一个随机数
–查看当前日期、时间
SQL> select sysdate from dual;
SYSDATE
———–
2007-1-24 1SQL> select to_char(sysdate,’yyyy-mm-dd hh24:mi:ss’) from dual;
TO_CHAR(SYSDATE,’YYYY-MM-DDHH2
——————————
2007-01-24 15:02:47
3、得到序列的下一个值或当前值,用下面语句
select your_sequence.nextval from dual;–获得序列your_sequence的下一个值
select your_sequence.currval from dual;–获得序列your_sequence的当前值
SQL> create sequence aaa increment by 1 start with 1;
SQL> select aaa.nextval from dual;
NEXTVAL
———-
1
SQL> select aaa.currval from dual;
CURRVAL
———-
1
4、可以用做计算器
select 7*9 from dual;
SQL> select 1+2 from dual;
1+2
———-
3
删除DUAL表后的处理
Oracle系统中dual表是一个“神秘”的表,网上有很多网友都对该表进行了测试,该表只有一行一列,其实该表和系统中的其他表一样,一样可以执行插入、更新、删除操作,还可以执行drop操作。但是不要去执行drop表的操作,否则会使系统不能用,数据库起不了,会报Database startup crashes with ORA-1092错误。
此时也不要慌乱,可以通过执行以下步骤来进行恢复。可以用sys用户登陆。
SQL> create pfile=’d:\pfile.bak’ from spfile
SQL> shutdown immediate
在d:\pfile.bak文件中最后加入一条:replication_dependency_tracking = FALSE
重新启动数据库:
SQL> startup pfile=’d:\pfile.bak’
SQL> create table “sys”.”DUAL”
( “DUMMY” varchar2(1) )
pctfree 10 pctused 4;
SQL> insert into dual values(‘X’);
SQL> commit;
SQL> Grant select on dual to Public;
授权成功。
SQL> select * from dual;
D

X
SQL> shutdown immediate
数据库已经关闭。
已经卸载数据库。
ORACLE 例程已经关闭。
SQL> startup
ORACLE 例程已经启动。
Total System Global Area 135338868 bytes
Fixed Size 453492 bytes
Variable Size 109051904 bytes
Database Buffers 25165824 bytes
Redo Buffers 667648 bytes
数据库装载完毕。
数据库已经打开。
SQL>
OK,这样就可以正常使用了。

评论已关闭!