DUAL表的内部功能?

时间:2015-10-09 05:09:15

标签: oracle dual-table

如果我们创建DUAL表,本地数据库是否会受到干扰?

请建议我?

create table DUAL
(
      x varchar2(1)
);

2 个答案:

答案 0 :(得分:1)

不,你不能创建双表。 DUAL表由SYS拥有,SYS拥有数据字典,因此您无法创建它。

请参阅wiki

  

DUAL表是默认存在的特殊单行表   Oracle数据库安装。它适用于选择a   伪列,例如SYSDATE或USER。桌上有一张   VARCHAR2(1)名为DUMMY的列,其值为' X'。

即使您尝试创建DUAL表,它也会为您创建问题,因为每次Oracle引擎必须确保您没有调用SYS双表。您还需要指定数据库和模式。这可能会导致Oracle引擎出现过多的歧义问题。 Oracle优化器知道DUAL所做的一切以及它应该做什么,然后根据它做事情。

SQL参考:

  

DUAL是由Oracle数据库自动创建的表   数据字典。 DUAL在用户SYS的模式中,但是   可以通过名称DUAL访问所有用户。它有一列,DUMMY,   定义为VARCHAR2(1),并包含一行值X.   从DUAL表中选择对于计算常量非常有用   使用SELECT语句表达式。因为DUAL只有一行,   常量只返回一次。或者,您可以选择一个   常量,伪列或任何表中的表达式,但值   将返回表格中有行的次数。参考   to"关于SQL函数"对于许多选择常数的例子   来自DUAL的价值。

     

从Oracle Database 10g第1版开始,逻辑I / O不是   在计算不具有的表达式时在DUAL表上执行   包括DUMMY列。此优化列为FAST DUAL   执行计划。如果从DUAL中选择DUMMY列,则   此优化不会发生,并且会发生逻辑I / O.

答案 1 :(得分:1)

  

如果我们创建DUAL表,本地数据库是否会受到干扰?

是的,当然可能会发生奇怪的事情。 DUAL由SYS拥有。 SYS拥有数据字典,因此DUAL是数据字典的一部分。您不能通过SQL修改数据字典。

第一个问题是" 您如何保证自己的DUAL表中只有一行"?

这可以追溯到 Steven Feuerstein 的原始文章 Self-Managing PL/SQL ,他解释了" 使用您自己的DUAL表&#34 ;.但是,当时DUAL表容易出现这种情况。那时候就是这样。

但是,在最近的版本中,DUAL表结构已经变得强大,并且您不能只有单行。这是一个证据:

SQL> conn sys@pdborcl as sysdba
Enter password:
Connected.
SQL> insert into dual select * from dual;

1 row created.

SQL> select * from dual;

D
-
X

我知道,很少有人会说我们可以使用触发器或ROWNUM = 1来处理我们自己的DUAL表中的一行,但是,您很快就会意识到这一点。因为DUAL表现在是一个内存结构而你不能在它上面添加一行,如上所示,它根本不需要从10g开始。

想象一下你创建了自己的DUAL表的情况,并且你正在使用PL / SQL代码中的DUAL表调用来获取USER,SYSDATE,SYSTIMESTAMP等。

这是从Oracle数据库提供的stdbody.sql文件中获取的代码:

1 FUNCTION USER
 2   RETURN VARCHAR2
 3 IS
 4   c VARCHAR2 (255);
 5 BEGIN
 6   SELECT USER
 7    INTO c
 8    FROM SYS.DUAL;
 9
10   RETURN c;
11 END;

如果您自己的DUAL表中有多行,则PL / SQL代码中对USER函数的每次调用都将失败,并出现 TOO_MANY_ROWS 错误。

底线:关于使用您自己的DUAL表的所有讨论在10g天之前都有意义。 DUAL表现在是一个强大的内存结构,并且不允许向其添加行。因此,使用您自己的DUAL表而不是SYS.DUAL是没有意义的。