分享
 
 
 

神秘的DUAL

王朝other·作者佚名  2006-01-08
窄屏简体版  字體: |||超大  

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.

So DUAL should ALWAYS have 1 and only 1 row

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有