DUAL表的内部功能



创建DUAL表会干扰本地数据库吗?

please Suggest me ?

create table DUAL
(
      x varchar2(1)
);

不能创建双表。DUAL表属于SYS,数据字典属于SYS,所以不能创建。

参见wiki

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

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

SQL参考:

DUAL是由Oracle数据库自动创建的表数据字典。DUAL在用户SYS的模式中,但是所有用户都可以通过名称DUAL访问。它只有一列,DUMMY,定义为VARCHAR2(1),并包含值为X的一行。从DUAL表中进行选择对于计算常数很有用表达式与SELECT语句。因为DUAL只有一行,该常量只返回一次。或者,您可以选择a常数、伪列或任何表中的表达式,但值除外将返回表中有多少行。请参考到"关于SQL函数"中查看许多选择常量的示例

从Oracle Database 10g Release 1开始,逻辑I/O不是当计算一个表达式时,在DUAL表上执行包括DUMMY列。这种优化被列为FAST DUAL in执行计划。如果从DUAL中选择DUMMY列,则这个优化没有发生,逻辑I/O发生了。

创建DUAL表会干扰本地数据库吗?

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

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

这可以追溯到Steven Feuerstein的原始文章自我管理PL/SQL,他在中解释了"使用您自己的DUAL表"。但是,那是在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表中的一行,但是,您很快就会意识到缺点。从10g开始,根本没有必要这样做,因为DUAL表现在是一个内存结构,您不能像上面演示的那样向它添加一行。

想象这样一种情况:您已经创建了自己的DUAL表,并且在PL/SQL代码中使用对DUAL表的调用来获取USER、SYSDATE、SYSTIMESTAMP等。

这是从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错误。

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

是没有意义的。

最新更新