【问题标题】:What is the dual table in Oracle?Oracle中的双表是什么?
【发布时间】:2023-03-19 05:10:01
【问题描述】:

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

【问题讨论】:

标签: oracle dual-table


【解决方案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; 返回序列中的下一个值。

                          【讨论】:

                            猜你喜欢
                            • 2015-04-06
                            • 1970-01-01
                            • 2013-04-08
                            • 1970-01-01
                            • 1970-01-01
                            • 2011-05-28
                            • 1970-01-01
                            • 2013-01-31
                            • 2010-09-20
                            相关资源
                            最近更新 更多