关于Oracle的Dual表

09年04月23日

很多人关心的是Dual的内部实现,这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.

    前两句话最为关键,实际上我们也容易猜到,Oracle通过内部代码来实现对于DUAL的访问和控制,并且通过Internal Code使得这个表与众不同。

    Tom提到在Close了Database之后,可以看到这个表的内存地址及展现,这说明这个表的结构并不单纯:

SQL> select * from dual;

D
-
X

SQL> alter database close;

Database altered.

SQL> select * from dual;

ADDR          INDX    INST_ID D
——– ———- ———- –
0A4F8858          0          1 X

    注意不要更改Dual表的内容,否则可能引起数据库的问题。

    如果该表意外删除,可以通过设置初始化参数replication_dependency_tracking = FALSE,重启数据库来重建该表。






相关文章:

  1. 总结:Oracle中视图的创建和处理方法(其他db参考)
  2. db2中是否有类似于oracle中nvl的函数使用总结
  3. DB2中case的用法
  4. linux下的文件和目录权限!
  5. 网页美化你还用小图标吗



  • 原文链接: http://www.astesys.com/database/oracle/60.html
  • 转载文章请注明: 爱思特
  • Tags: , 分类: Oracle

    发表评论