Oracle中的双表是什么?

Oracle中的双表是什么?

What is the dual table in Oracle?

我听说有人提到这张桌子,但不确定它是关于什么的。


这是一种具有单个记录的虚拟表,用于在您实际上不对数据感兴趣时选择,而是在select语句中希望某些系统函数的结果:

例如select sysdate from dual;

参见http://www.adp-gmbh.ch/ora/misc/dual.html


它是一个虚拟表,其中包含一个元素。这很有用,因为Oracle不允许使用以下语句

1
 SELECT 3+4

您可以通过以下方式解决此限制:

1
 SELECT 3+4 FROM DUAL

代替。


来自维基百科

历史

DUAL表是由Oracle公司的Chuck Weiss创建的,用于提供用于内部视图联接的表:

I created the DUAL table as an underlying object in the Oracle Data Dictionary. It was never meant to be seen itself, but instead used
inside a view that was expected to be queried. The idea was that you
could do a JOIN to the DUAL table and create two rows in the result
for every one row in your table. Then, by using GROUP BY, the
resulting join could be summarized to show the amount of storage for
the DATA extent and for the INDEX extent(s). The name, DUAL, seemed
apt for the process of creating a pair of rows from just one. 1

从上面可能看不出来,但是原始DUAL表中有两行(因此得名)。如今,它只有一行。

优化

DUAL最初是一个表,并且从DUAL中进行选择时,数据库引擎将在表上执行磁盘IO。由于磁盘块通常已经缓存在内存中,因此该磁盘IO通常是逻辑IO(不涉及物理磁盘访问)。这导致针对DUAL表的大量逻辑IO。

Oracle数据库的更高版本已经过优化,即使DUAL表实际上仍然存在,该数据库也不再在DUAL表上执行物理或逻辑IO。


我认为这篇维基百科文章可能有助于澄清。

http://en.wikipedia.org/wiki/DUAL_table

The DUAL table is a special one-row
table present by default in all Oracle
database installations. It is suitable
for use in selecting a pseudocolumn
such as SYSDATE or USER The table has
a single VARCHAR2(1) column called
DUMMY that has a value of"X"


这是Oracle中的特殊表。我经常将其用于计算或检查系统变量。例如:

  • Select 2*4 from dual打印出计算结果
  • Select sysdate from dual打印服务器当前日期。

Oracle中的实用程序表,只有1行和1列。它用于执行许多算术运算,通常可用于需要生成已知输出的地方。

SELECT * FROM dual;

将给出单行,并带有一个名为" DUMMY"的列和一个值为" X"的值,如下所示:

1
2
3
DUMMY
-----
X


您可以针对某种伪表运行命令并获取结果,例如sysdate。还可以帮助您检查Oracle是否启动并检查sql语法等。


有关DUAL的更多事实...

http://asktom.oracle.com/pls/asktom/f?p=100:11:0:::::P11_QUESTION_ID:1562813956388

此处完成了激动人心的实验,汤姆也做了更多激动人心的解释


DUAL表是一种特殊的单行表,默认情况下在所有Oracle数据库安装中都存在。它适用于选择伪列,例如SYSDATE或USER

该表具有一个名为DUMMY的VARCHAR2(1)列,其值是" X"

您可以在http://en.wikipedia.org/wiki/DUAL_table中阅读全部内容


使用仅在SQL中可用的功能,在PL / SQL开发中必须使用DUAL

例如

1
2
3
4
5
6
7
DECLARE
x XMLTYPE;
BEGIN
SELECT xmlelement("hhh", 'stuff')
INTO x
FROM dual;
END;

DUAL是一种特殊的一行,一列表默认情况下出现在所有Oracle数据库中。 DUAL的所有者是SYS。

DUAL是由Oracle数据库自动创建的表以及数据功能。 它总是用于获取操作系统功能(例如日期,时间,算术表达式等)。

1
SELECT SYSDATE from dual;


另一个需要select ... from dual的情况是,当我们想使用内置的DBMS_METADATA.GET_DDL函数检索不同数据库对象(例如TABLE,FUNCTION,TRIGGER,PACKAGE)的代码(数据定义)时:

1
2
3
select DBMS_METADATA.GET_DDL('TABLE','<table_name>') from DUAL;

select DBMS_METADATA.GET_DDL('FUNCTION','<function_name>') from DUAL;

确实,当今的IDE确实提供了查看表的DDL的功能,但是在像SQL Plus这样的简单环境中,这确实很方便。

编辑

更普遍的情况:基本上,当我们需要在标准SQL语句中使用任何PL / SQL过程时,或者当我们想从命令行调用过程时:

1
select my_function(<input_params>) from dual;

两种食谱均摘自Josh Juneau和Matt Arena的书《 Oracle PL / SQL食谱》


DUAL我们主要用于从序列中获取下一个数字。

语法:SELECT'sequence_name'.NEXTVAL FROM DUAL

这将返回一行一列的值(NEXTVAL列名)。


从返回1空行中放入的对象。例如:
从对偶中选择1;
返回1

从双选中选择21 + 44;
返回65

从对偶中选择[sequence] .nextval;
返回序列中的下一个值。


推荐阅读