Oracle中的双表是什么?

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

261107 次浏览

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

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

DUAL表是一个特殊的单行表 表默认存在于所有Oracle中 数据库安装。这是合适的 用于选择伪列 例如SYSDATE或USER表有 一个单独的VARCHAR2(1)列称为 值为“X”

的DUMMY

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

它是一种虚拟表,只有一条记录,用于在你实际上对数据不感兴趣时进行选择,而是希望在选择语句中获得一些系统函数的结果:

例如select sysdate from dual;

看到http://www.adp-gmbh.ch/ora/misc/dual.html

截至23c, Oracle支持select sysdate /* or other value */,而不支持from dual,因为MySQL已经支持了一段时间。

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

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

它是一个包含一个元素的虚拟表。它很有用,因为Oracle不允许这样的语句

 SELECT 3+4

您可以通过编写来绕过这个限制

 SELECT 3+4 FROM DUAL

代替。

它是一个放入from返回1空行的对象。例如: Select 1 from dual; 返回1 < / p >

select 21+44 from dual; 返回65 < / p > < p >选择(序列)。Nextval from dual;

.返回序列中的下一个值

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

该表有一个名为DUMMY的VARCHAR2(1)列,其值为“X”

你可以在http://en.wikipedia.org/wiki/DUAL_table中读到所有关于它的内容

维基百科

历史

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

我在Oracle数据字典中创建了DUAL表作为底层对象。它本身从来就不是用来看的,而是用来用的 在期望被查询的视图中。我的意思是你 可以做一个JOIN到DUAL表,并在结果中创建两行 对于表中的每一行。然后,通过使用GROUP by,将 可以汇总结果连接,以显示存储的数量 DATA区段和INDEX区段。这个名字,DUAL,似乎 适用于从一行创建一对行的过程。1 < / em > < / p >

从上面可能看不太明显,但原来的DUAL表中有两行(因此得名)。现在它只有一行。

优化

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

Oracle数据库的后续版本已经进行了优化,数据库不再对DUAL表执行物理或逻辑IO,即使DUAL表仍然存在。

DUAL是PL/SQL开发中使用仅在SQL中可用的函数所必需的

如。

DECLARE
x XMLTYPE;
BEGIN
SELECT xmlelement("hhh", 'stuff')
INTO x
FROM dual;
END;

关于DUAL的更多事实....

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

这里做的令人激动的实验,还有汤姆更令人激动的解释

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

SELECT * FROM dual;

将给出一个单行,一个名为“DUMMY”的列和一个值“X”,如下所示:

DUMMY
-----
X

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

语法:SELECT 'sequence_name'。Nextval from dual

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

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

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过程时,或者当我们想从命令行调用一个过程时:

select my_function(<input_params>) from dual;

这两个食谱都摘自Josh Juneau和Matt Arena所著的《Oracle PL/SQL recipes》一书

DUAL是一种特殊的单行一列表,默认存在于所有Oracle数据库中。DUAL的所有者是SYS。

DUAL是Oracle数据库与数据函数一起自动创建的表。它总是用于获取操作系统函数(如日期、时间、算术表达式)。等)。

SELECT SYSDATE from dual;