如果我们创建DUAL表,本地数据库是否会受到干扰?
请建议我?
create table DUAL
(
x varchar2(1)
);
答案 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是没有意义的。