我听到有人提到过这张桌子,但不确定它是关于什么的。
我认为维基百科的这篇文章可能有助于澄清。
http://en.wikipedia.org/wiki/DUAL_table
DUAL表是一个特殊的单行表 表默认存在于所有Oracle中 数据库安装。这是合适的 用于选择伪列 例如SYSDATE或USER表有 一个单独的VARCHAR2(1)列称为 值为“X”的DUMMY
它是一种虚拟表,只有一条记录,用于在你实际上对数据不感兴趣时进行选择,而是希望在选择语句中获得一些系统函数的结果:
例如:select sysdate from dual;
参见http://www.adp-gmbh.ch/ora/misc/dual.html
从23c开始,Oracle支持选择sysdate /*或其他值*/,而不是from dual,因为MySQL已经支持了一段时间。
它是一个包含一个元素的虚拟表。它很有用,因为Oracle不允许这样的语句
SELECT 3+4
您可以通过编写来绕过这个限制
SELECT 3+4 FROM DUAL
代替。
它是一个放入from返回1空行的对象。例如: Select 1 from dual; 返回1
从dual中选择21+44; 返回65
选择(序列)。Nextval from dual; 返回序列中的下一个值。
DUAL表是一个特殊的单行表,默认存在于所有Oracle数据库安装中。它适合用于选择伪列,如SYSDATE或USER
该表有一个名为DUMMY的VARCHAR2(1)列,其值为“X”
你可以在http://en.wikipedia.org/wiki/DUAL_table上阅读所有相关信息
从维基百科
历史
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表执行物理或逻辑IO,即使DUAL表仍然存在。
DUAL是PL/SQL开发中使用仅在SQL中可用的函数所必需的
e.g.
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”,如下所示:
假 ----- X
DUAL主要用于从序列中获取下一个数字。
语法:SELECT 'sequence_name'。Nextval from dual
这将返回一行一列的值(NEXTVAL列名)。
另一种情况需要选择…当我们想要检索不同数据库对象(如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这样的简单环境中,这是非常方便的。
EDIT
更一般的情况:基本上,当我们需要在标准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;
推荐文章
- Oracle中的双表是什么?
- Oracle中不区分大小写的搜索
- 如何在Oracle SQL开发者中导出查询结果到csv ?
- Oracle SQL Developer多表视图
- 如何在Oracle中做top 1 ?
- Oracle Partition By关键字
- 如何使用服务名而不是SID连接到Oracle
- 从多个表中选择count(*)
- 内部连接vs Where
- 我如何列出一个表中的所有列?
- 如何在不复制数据的情况下创建Oracle表的副本?
- Oracle中的varchar和varchar2有什么区别?
- 如何在Oracle中查找表中的重复值?
- Oracle SQL:用另一个表的数据更新一个表
- ORA-12514 TNS:监听器当前不知道连接描述符中请求的服务