Oracle中的双表是啥?
Posted
技术标签:
【中文标题】Oracle中的双表是啥?【英文标题】:What is the dual table in Oracle?Oracle中的双表是什么? 【发布时间】:2010-09-09 13:55:38 【问题描述】:我听说有人提到这张桌子,但不确定它是关于什么的。
【问题讨论】:
asktom.oracle.com/pls/asktom/… 双重详情 最好的答案是关于双重asktom.oracle.com/pls/asktom/…,人们没有更多地关注上面的评论链接,这就是我在这里评论的原因..看看它,你不会后悔 【参考方案1】:这是一种虚拟表,只有一条记录,用于在您实际上对数据不感兴趣,而是希望在 select 语句中获得某些系统函数的结果时进行选择:
例如select sysdate from dual;
见http://www.adp-gmbh.ch/ora/misc/dual.html
【讨论】:
【参考方案2】:这是一个包含一个元素的虚拟表。它很有用,因为 Oracle 不允许像
这样的语句 SELECT 3+4
你可以通过写来绕过这个限制
SELECT 3+4 FROM DUAL
改为。
【讨论】:
【参考方案3】:来自Wikipedia
历史
DUAL 表由 Oracle 公司的 Chuck Weiss 创建,用于提供用于连接内部视图的表:
我创建了 DUAL 表作为 Oracle 数据字典中的基础对象。它从来不打算被看到,而是被使用 在预期会被查询的视图中。这个想法是你 可以对 DUAL 表执行 JOIN 并在结果中创建两行 表中的每一行。然后,通过使用 GROUP BY, 可以汇总生成的连接以显示 DATA 范围和 INDEX 范围。 DUAL 这个名字似乎 适合从一个行创建一对行的过程。 1
从上面可能看不出来,但原来的 DUAL 表中有两行(因此得名)。现在它只有一排。
优化
DUAL 原本是一张表,数据库引擎在选择 DUAL 时会对该表进行磁盘 IO。这个磁盘 IO 通常是逻辑 IO(不涉及物理磁盘访问),因为磁盘块通常已经缓存在内存中。这导致了针对 DUAL 表的大量逻辑 IO。
Oracle 数据库的更高版本已经过优化,数据库不再对 DUAL 表执行物理或逻辑 IO,即使 DUAL 表仍然存在。
【讨论】:
【参考方案4】:我认为这篇***文章可能有助于澄清。
http://en.wikipedia.org/wiki/DUAL_table
DUAL 表是一个特殊的单行表 默认情况下存在于所有 Oracle 中的表 数据库安装。很合适 用于选择伪列 如 SYSDATE 或 USER 表有 一个名为 VARCHAR2(1) 的列 值为“X”的 DUMMY
【讨论】:
【参考方案5】:这是Oracle中的特殊表。我经常用它来计算或检查系统变量。例如:
Select 2*4 from dual
打印出计算结果
Select sysdate from dual
打印服务器当前日期。
【讨论】:
【参考方案6】:一种可以运行命令并返回结果的伪表,例如 sysdate。还可以帮助您检查Oracle是否已启动并检查sql语法等。
【讨论】:
【参考方案7】:Oracle 中只有 1 行 1 列的实用程序表。它用于执行多种算术运算,通常可用于需要生成已知输出的地方。
SELECT * FROM dual;
将给出单行,单列名为“DUMMY”,值为“X”,如下所示:
DUMMY ----- X
【讨论】:
【参考方案8】:DUAL 表是一种特殊的单行表,默认情况下出现在所有 Oracle 数据库安装中。适合用于选择 SYSDATE 或 USER 等伪列
该表有一个名为 DUMMY 的 VARCHAR2(1) 列,其值为“X”
您可以在http://en.wikipedia.org/wiki/DUAL_table阅读所有相关信息
【讨论】:
【参考方案9】:在 PL/SQL 开发中需要 DUAL 才能使用仅在 SQL 中可用的函数
例如
DECLARE
x XMLTYPE;
BEGIN
SELECT xmlelement("hhh", 'stuff')
INTO x
FROM dual;
END;
【讨论】:
【参考方案10】:更多关于 DUAL 的事实......
http://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:1562813956388
在这里完成了激动人心的实验,汤姆的解释更令人兴奋
【讨论】:
【参考方案11】:DUAL 我们主要用于从序列中获取下一个数字。
语法:SELECT 'sequence_name'.NEXTVAL FROM DUAL
这将返回一行一列的值(NEXTVAL 列名)。
【讨论】:
从 11g 开始就不需要了。序列可以在 PL/SQL 中原生使用。【参考方案12】:另一种需要select ... from dual
的情况是当我们想要使用内置的DBMS_METADATA.GET_DDL
函数检索不同数据库对象(如TABLE、FUNCTION、TRIGGER、PACKAGE)的代码(数据定义)时:
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 秘诀”一书
【讨论】:
【参考方案13】:DUAL 是特殊的一行一列表,默认情况下出现在所有 Oracle 数据库中。 DUAL 的所有者是 SYS。
DUAL 是 Oracle 数据库与数据函数一起自动创建的表。它总是用于获取操作系统函数(如日期、时间、算术表达式等)
SELECT SYSDATE from dual;
【讨论】:
【参考方案14】:这是一个放入 from 的对象,返回 1 个空行。例如: 从对偶中选择 1; 返回 1
从对偶中选择 21+44; 返回 65
select [sequence].nextval from dual; 返回序列中的下一个值。
【讨论】:
以上是关于Oracle中的双表是啥?的主要内容,如果未能解决你的问题,请参考以下文章