ASK TOM之中英文对照20051228————关于DUAL表

本人文档,如需转载,请注明出处.

Tom 您好
在沉默一段时间后提问感觉非常好
看下面的例子
SQL> desc dual
Name Null? Type————————————————————-——————————————————DUMMY VARCHAR2

SQL> select * from dual;

D – X

SQL> select count(*) from dual;

COUNT————— 1

SQL> select ‘sdfsdfsdfsdfsdfsdf’ from dual;

‘SDFSDFSDFSDFSDFSD—————————sdfsdfsdfsdfsdfsdf

SQL> select 3434334 from dual;

3434334————— 3434334

SQL> truncate table dual;
truncate table dual

*
ERROR at line 1:
ORA-04020: deadlock detected while trying to lock object
3510531527724648449742036

SQL> delete from dual;
delete from dual

*
ERROR at line 1:
ORA-01031: insufficient privileges

SQL> connect system/manager
Connected.
SQL> /

1 row deleted.

SQL> commit;

Commit complete.

SQL> select * from dua;
select * from dua

*
ERROR at line 1:
ORA-00942: table or view does not exist

SQL> select * from dual;

no rows selected

1:dual表是什么东西?它的目的是什么?
2:为什么它包含的唯一的列是varchar2型的,为什么不是number型?
3:它默认是否包含一行?
4:为什么我们通常作
selecr user from dual;
而不是
SQL> select USER FROM EMP WHERE ROWNUM<2;

USER———————————————SCOTT
5:是否意味着我们使用dual表仅仅当含有一行的时候比较便利,是否它仅仅只是返回一行,什么时候我们可以作select user from dual
6:SQL> SELECT COUNT FROM DUAL;

COUNT————— 2

SQL> INSERT INTO DUAL VALUES (‘X’);

1 row created.

SQL> INSERT INTO DUAL VALUES (‘X’);

1 row created.

SQL> COMMIT;

Commit complete.

SQL> SELECT COUNT FROM DUAL;

COUNT————— 4

SQL> SELECT * FROM DUAL;

D – X
为什么他仅仅返回一行,但是它是有四行的,而且它也是允许我插入四行记录的
7:
SQL> delete from dual;

1 row deleted.

SQL> select * from dual;

D – X

SQL> select count(*) from dual;

COUNT————— 3
我想删除所有的行,并且我作了一个删除,但是你看,它仅仅删除了一行,为什么?
8:
delete from dual;

1 row deleted.

SQL> delete from dual;

1 row deleted.

SQL> select count(*) from dual;

COUNT————— 1
现在我们仅仅只有一行在dual中
让我们创建一个实例函数
create or replace function foo return number 2 as 3 x number; 4 begin 5 x:=1; 6 return 1; 7 end; 8 /

Function created.

SQL> select foo from dual;

FOO————— 1

SQL> insert into dual values (‘X’);

1 row created.

SQL> COMMIT;

Commit complete.

SQL> SELECT COUNT FROM DUAL;

COUNT————— 2

SQL> select foo from dual;

FOO————— 1

对于第一个值,为什么不返回2行
因为,看下面,我得到了14行,因为我有14行在这个表中
SQL> SELECT FOO FROM EMP;

FOO————— 1 1 1 1 1 1 1 1 1 1 1 FOO————— 1 1 1

14 rows selected.

SQL>

请通俗的说明dual表的内容,如果可能,请举例说明它,谢谢

回答
我们开始回答,dual的属主是SYS.SYS也是数据字典的属主,所以,dual也是数据字典的一个部分.你不能直接通过sql来修改数据字典的内容,否则一些不好的事情将会或者可能发生,你也演示了这些情况.如果你在oracle中修改了数据字典,可能导致很多奇怪的事情发生.这即不是推荐和支持的,也不是一个好主意
1:dual表是什么,它有什么目的

dual仅仅是一个虚拟的表.你不需要使用它,你能使用任何其他你想要的东西.当你在查询中使用dual的时候,明白dual是一个特别的一行,一列的表,当开发这个计划的时候,是基于这个基础的.
2:为什么它包含的仅仅是varchar2的列,不是number; 对,为什么不.为什么你不问它为什么不是date型的.这个列,它的名字,它的数据类型甚至它的值,并没有关联.dual的存在意味着我们可以可靠的查询1行从这个表中,这就是全部.
3:dual包含默认值吗? 对,当我们创建数据库的时候,我们创建dual,并且有一行数据在其中
4:为什么我们通常用
SELECT USER FROM DUAL,
为什么我们不用
SQL> select USER FROM EMP WHERE ROWNUM<2; 对,为什么你不能用?是有什么事情阻止你这么作吗?如果你想这么作,是可以的.我还是坚持使用”select user from dual”.我知道dual存在,我知道它有且仅有1行.我也很好的知道dual并且能用它是我的事情更有效率.
5:对
6:最好明白dual是一个神奇的表,仅仅只有一行的表.它会对select *操作停止,是因为它只有一行.它仅仅依据这个来工作,希望你能重新把dual设置回一行在你测试完成或者你的数据库崩溃后.
7:就象我说的,dual是神奇的,在dual上所作的所有操作以及事情必须基于这个.
8:dual=magic.dual是一个只有一行的表.多于一行会很危险.你更新了数据字典.很自然的,你可能会碰到很多坏的事情.

原文标题:all about the DUAL table
原文————————————————————————————————————————
原文版权归属asktom.oracle.com所有,翻译 by gytyl•OracleDBA
2005-12-28



 

5 Comments to “ASK TOM之中英文对照20051228——–关于DUAL表”


  1. dbcmye zhsdyqkg — September 3, 2006 @ 12:35 am

    lwkspg pbluxka gcxqlju sjwvbdpum wvqurdhn vmsen dvaf

  2. fdgky dpbn — September 3, 2006 @ 12:35 am

    vbkpdumjt cmtx bwdzecx hclo jdxwqmapu rgkyf bnvfqxlo http://www.csmjfdztp.ygcekphqj.com

  3. acorn slipper sock — September 3, 2006 @ 1:57 pm

    Good site. Thanks
    http://acorn-slipper-sock.rusdoor.com acorn slipper sock

  4. acorn slipper sock — September 5, 2006 @ 9:23 am

    Nice site. Thanks:-)
    http://acorn-slipper-sock.rusdoor.com acorn slipper sock

  5. acorn-slipper-sock.rusdoor.com acorn slipper sock — September 5, 2006 @ 9:56 am

    Very good site. Thank you!
    http:// acorn-slipper-sock.rusdoor.com acorn slipper sock



Write a comment

You need tologin.