Oracle学习笔记之Dual表

  最近在使用Oracle时遇到一个特殊的表Dual。想必了解Oracle的人对Dual的使用情有独钟。于是乎在网上找了些帖子,觉得比较好贴在这里供大家学习。

  dual是一个虚拟表,用来构成select的语法规则,oracle保证dual里面永远只有一条记录。我们可以用它来做很多事情,如下:

1、查看当前用户,可以在 SQL Plus中执行下面语句 select user from dual;

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;--获得一个随机数

3、得到序列的下一个值或当前值,用下面语句

    select your_sequence.nextval from dual;--获得序列your_sequence的下一个值

   select your_sequence.currval from dual;--获得序列your_sequence的当前值

4、可以用做计算器 select 7*9 from dual;

 

5:这条是自己加的。如果在使用一条SQL语句同时插入多条数据时也会用到Dual表。而且这个速度一定是比For循环插入数据要快很多。

    insert into 表名(字段1,字段2) 

select '一','二' from dual         

union all                                 

select '三','四' from dual         

union all                                 

select '五','六' from dual         

union all                                 

select '七','八' from dual         

union all                                 

select '九','十' from 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”

[an error occurred while processing this directive]

=====

DUAL ? 有什么神秘的? 当你想得到ORACLE系统时间, 简简单单敲一行SQL 不就得了吗? 故弄玄虚…. 

SQL> select sysdate from dual; 

SYSDATE 

--------- 

28-SEP-03 

哈哈, 确实DUAL的使用很方便. 但是大家知道DUAL倒底是什么OBJECT, 它有什么特殊的行为吗? 来,我们一起看一看. 首先搞清楚DUAL是什么OBJECT : 

SQL> connect system/manager 

Connected. 

SQL> select owner, object_name , object_type from dba_objects where object_name like '%DUAL%'; OWNER OBJECT_NAME OBJECT_TYPE 

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

SYS DUAL TABLE PUBLIC DUAL SYNONYM 

原来DUAL是属于SYS schema的一个表,然后以PUBLIC SYNONYM的方式供其他数据库USER使用. 

再看看它的结构: 

SQL> desc dual Name Null? Type 

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

DUMMY VARCHAR2(1) 

SQL> 

只有一个名字叫DUMMY的字符型COLUMN . 

然后查询一下表里的数据: 

SQL> select dummy from dual; 

DUMMY 

---------- 

X 

哦, 只有一条记录, DUMMY的值是’X’ .很正常啊,没什么奇怪嘛. 好,下面就有奇妙的东西出现了! 

插入一条记录: 

SQL> connect sys as sysdba 

Connected. 

SQL> insert into dual values ( 'Y'); 

1 row created. 

SQL> commit; 

Commit complete. 

SQL> select count(*) from dual; 

COUNT(*) 

---------- 

2 

迄今为止,一切正常. 然而当我们再次查询记录时,奇怪的事情发生了 

SQL> select * from dual; 

DUMMY 

---------- 

X 

刚才插入的那条记录并没有显示出来 ! 明明DUAL表中有两条记录, 可就是只显示一条! 

再试一下删除 ,狠一点,全删光 ! 

SQL> delete from dual; /*注意没有限定条件,试图删除全部记录*/ 

1 row deleted. 

SQL> commit; 

Commit complete. 

哈哈,也只有一条记录被删掉, 

SQL> select * from dual; 

DUMMY 

---------- 

Y 

为什么会这样呢? 难道SQL的语法对DUAL不起作用吗?带着这个疑问,

我查询了一些ORACLE官方的资料. 原来ORACLE对DUAL表的操作做了一些内部处理,尽量保证DUAL表中只返回一条记录.当然这写内部操作是不可见的 . 看来ORACLE真是蕴藏着无穷的奥妙啊! 

附: ORACLE关于DUAL表不同寻常特性的解释 There is internalized code that makes this happen. Code checks that ensure that a table scan of SYS.DUAL only returns one row. Svrmgrl behaviour is incorrect but this is now an obsolete product. The base issue you should always remember and keep is: DUAL table should always have 1 ROW. Dual is a normal table with one dummy column of varchar2(1). This is basically used from several applications as a pseudo table for getting results from a select statement that use functions like sysdate or other prebuilt or application functions. If DUAL has no rows at all some applications (that use DUAL) may fail with NO_DATA_FOUND exception. If DUAL has more than 1 row then applications (that use DUAL) may fail with TOO_MANY_ROWS exception. 

(转载:http://zhoujingxian.javaeye.com/blog/494288) 

你可能感兴趣的:(oracle学习)