神秘的DUAL

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

 

 

时间: 2016-02-09

神秘的DUAL的相关文章

神秘的DUAL ------ black

标题 神秘的DUAL black_snail(原作) 关键字 ORACLE DUAL DUAL ? 有什么神秘的? 当你想得到ORACLE系统时间, 简简单单敲一行SQL 不就得了吗? 故弄玄虚-. SQL> select sysdate from dual; SYSDATE --------- 28-SEP-03 哈哈, 确实DUAL的使用很方便. 但是大家知道DUAL倒底是什么OBJECT, 它有什么特殊的行为吗? 来,我们一起看一看. 首先搞清楚DUAL是什么OBJECT : SQL>

Oracle中dual表的用途介绍

导读]dual是一个虚拟表,用来构成select的语法规则,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

MaxCompute原(ODPS)创建dual表

大家以前写sql写func的时候习惯性会用from dual 来进行测试,dual表在传统数据库中是一个"神秘"的表,网上有很多网友都对该表进行了测试,该表只有一行一列,其实该表和系统中的其他表一样.  发现odps项目里没有, 然后就手动建了个表. 看上去没啥问题, 我后来运行任何函数, 都没有任何返回值, 我就纳闷了,怎么啥都不对, 后来经高人提点, 是不是你手动建的dual表里没内容,我突然间恍然大悟, 遂了一条数据到第一行中, 再次运行,就有值了. 所以这里也提醒大家: Fun

PS制作神秘的绿色光影文字效果详细教程

photoshop 教程中,我将为大家介绍使用photoshop中的图层样式功能配合花草素材的合成制作一款绿色的神秘文字特效 1.首先新建一个图片,大小自由决定,我设置了800*400,然后单击下载字体,使用这个字体在图片中输入文字,如图所示 2.接下来是关键步骤了.执行"图层-图层样式"为文字图层分另添加内阴影.外发光.斜面和浮雕.纹理.颜色叠加这几个图层样式效果. 内阴影:颜色为#287320,不透明度100%,角度120,距离0,阻塞4,大小5,等高线设置为"内凹-深&

黑客精神祭 挖掘神秘黑客背后的故事

无论媒体如何渴望挖掘黑客背后的故事.黑客始终是一群神秘的存在.于是乎,笔者的这篇黑客精神祭的直接叙述对象也就指向了更为人们所知的"病毒". 病毒诞生之初--严谨之美 当你看着爱机被病毒蹂躏的时候,或许你根本无从感觉病毒之美.但是,如果你愿意纯粹以技术角度评判病毒的话,或许你能在病毒诞生之初,发现它的美.那是一种精密逻辑思维构筑下的严谨之美. 1986年,大脑病毒面世.它是世界上第一个DOS病毒,同时也开创了引导区病毒的先河.它用汇编语言写成,代码精简,有很高的编程技术.大脑病毒是用极其

Photoshop绘制神秘眼睛

这个教程自我感觉效果还是有那么一点点的,做的过程很简单,很容易上手,就是练到图像的变形和笔涮的应用, 做出神秘的眼睛. 这个教程自我感觉效果还是有那么一点点的,做的过程很简单,很容易上手,就是练到图像的变形和笔涮的应用, 做出神秘的眼睛.天煞. 效果图:  所用素材:  教程步骤: 第一步 新建大小为1408*2100分辨率为300的文件,填充黑色,打开素材,选取如图所示区域拉入画布中,ctrl+T 右键选择旋转90度(顺时针),调整大小位置如图  第二步 我们发现眼睛不规则,做出来图不好看,我

一个简单例子教你揭开AJAX神秘面纱

ajax 本文通过一个简单的例子来说明如何在IE6中使用AJAX技术.在这例子中,客户端每隔十秒,从服务器端取回一个随机的字符串,在不重新刷新页情况下,自动更新部分页面内容.例子仅用到了两个jsp文件,client.jsp及server.jsp. AJAX,即"Asynchronous JavaScript And XML"的缩写,可翻译为异步JavaScript及XML技术.其核心是一个寄宿在浏览器中名为XMLHTTPRequest的类.通过此类,可以做到无需提交表单就可以实现与服务

Ajax并不神秘:揭下各种Ajax控件和类库的小裤衩

ajax|控件 Ajax控件和类库现在真的太多了,不知不觉中增加了Ajax的神秘性和复杂性,看到版内很多人为此费解和伤神,决定发此贴谈谈本人对Ajax的观点,希望能让大家对Ajax有一个本质的认识. 观点一:Ajax和服务器端技术毫不相关 严格的说,与传统web开发相比,Ajax是完完全全的客户端技术.由于很多控件封装了客户端和服务器端的通信过程,因此很多问题也因通信而起.事实上,不论何种Ajax技术,服务器端都是返回的一个纯文本流,再由客户端来处理这个文本.这段文本可以是xml格式,也可以是一

用Javascript 实现的Dual listbox

javascript 这是我用 javascript 制作的"Dual listbox"(双向选择器)的一个应用示例,是从我的代码中抠出来的.在网页编程中经常会用到.    也许我的实现太烦琐了,希望大家有更好的代码贡献出来.   <html>  <head>  <title>选择器</title>  <link href="./style/style.css" rel="stylesheet"