`

神秘的 ORACLE DUAL

阅读更多
DUAL ? 有什么神秘的? 当你想得到ORACLE系统时间, 简简单单敲一行SQL不就得了吗? 故弄玄虚…. 
  
  SQL> select sysdate from dual; 
  
  SYSDATE 
     --------- 
  
  02-DEC-07
  
  哈哈, 确实DUAL的使用很方便. 但是大家知道DUAL倒底是什么OBJECT, 它有什么特殊的行为吗? 来,我们一起看一看. 
  
  首先搞清楚DUAL是什么OBJECT : 
  
  SQL> connect system/manager 
  
  Connected. 
  
  SQL> select owner, object_name , object_type from dba_objects where object_name like '%DUAL%'; 
  
  OWNER OBJECT_NAME OBJECT_TYPE 
  
  --------------- --------------- ------------- 
  
  SYS DUAL TABLE 
  
  PUBLIC DUAL SYNONYM 
  
  原来DUAL是属于SYS schema的一个表,然后以PUBLIC SYNONYM的方式供其他数据库USER使用.    
  再看看它的结构: 
  
  SQL> desc dual 
  
  Name Null? Type 
  
  ----------------------------------------- -------- ---------------------------- 
  
  DUMMY VARCHAR2(1) 
  
  SQL> 
  
  只有一个名字叫DUMMY的字符型COLUMN . 
  
  然后查询一下表里的数据: 
  
  SQL> select dummy from dual; 
  
  DUMMY 
  
  ---------- 
  
  X 
  
  
  哦, 只有一条记录, DUMMY的值是’X’ .很正常啊,没什么奇怪嘛. 好,下面就有奇妙的东西出现了! 
  
  插入一条记录: 
  
  SQL> connect sys as sysdba 
  
  Connected. 
  
  SQL> insert into dual values ( 'Y'); 
  
  1 row created. 
  
  SQL> commit; 
  
  Commit complete. 
  
  SQL> select count(*) from dual; 
  
  COUNT(*) 
  
  ---------- 
  
  2 
  
  迄今为止,一切正常. 然而当我们再次查询记录时,奇怪的事情发生了 
  
  SQL> select * from dual; 
  
  DUMMY 
  
  ---------- 
  
  X 
  
  刚才插入的那条记录并没有显示出来 ! 明明DUAL表中有两条记录, 可就是只显示一条! 
  
  再试一下删除 ,狠一点,全删光 ! 
  
  SQL> delete from dual; /*注意没有限定条件,试图删除全部记录*/ 
  
  1 row deleted. 
  
  SQL> commit; 
  
  Commit complete. 
  
  哈哈,也只有一条记录被删掉, 
  
  SQL> select * from dual; 


  DUMMY 
  
  ---------- 
  
  Y 
  
  为什么会这样呢? 难道SQL的语法对DUAL不起作用吗?带着这个疑问, 我查询了一些ORACLE官方的资料. 原来ORACLE对DUAL表的操作做了一些内部处理,尽量保证DUAL表中只返回一条记录.当然这写内部操作是不可见的 . 
  
  看来ORACLE真是蕴藏着无穷的奥妙啊! 
  
  附: ORACLE关于DUAL表不同寻常特性的解释 
  
  There is internalized code that makes this happen. Code checks that ensure that a table scan of SYS.DUAL only returns one row. Svrmgrl behaviour is incorrect but this is now an obsolete product. 
  
   The base issue you should always remember and keep is: DUAL table should always have 1 ROW. Dual is a normal table with one dummy column of varchar2(1). 
  
  This is basically used from several applications as a pseudo table for getting results from a select statement that use functions like sysdate or other prebuilt or application functions. If DUAL has no rows at all some applications (that use DUAL) may fail with NO_DATA_FOUND exception. If DUAL has more than 1 row then applications (that use DUAL) may fail with TOO_MANY_ROWS exception. 

        So DUAL should ALWAYS have 1 and only 1 row 
分享到:
评论

相关推荐

    oracle之dual表的一些

    ### Oracle之DUAL表的理解与应用 #### 一、引言 在Oracle数据库环境中,`DUAL`表是一个特殊的表,被广泛应用于多种查询场景之中。本文将从多个角度深入探讨`DUAL`表的特性及其应用场景,帮助读者更好地理解和掌握这...

    Oracle中的dual

    Oracle 中的 Dual Dual 是 Oracle 中的一个虚拟表,用于构成 SELECT 语句的语法规则。 Oracle 保证 Dual 表中永远只有一条记录。Dual 表的存在使得我们可以使用它来执行各种操作,以下是 Dual 表的一些应用场景: ...

    详解Oracle数据库中DUAL表的使用

    Oracle 数据库中 DUAL 表的使用 DUAL 表是 Oracle 数据库中一个特殊的表,它是任何用户都可以读取的公共表。DUAL 表的用途非常广泛,常用在没有目标表的 Select 语句块中。下面都是 DUAL 表的一些常见使用场景: ...

    oracle 不存在dual情况下注入.doc

    根据提供的文档标题、描述、标签以及部分内容,本文将围绕Oracle数据库中的SQL注入技术进行深入解析,特别是当目标系统中不存在`dual`表时如何进行有效的数据挖掘。 ### Oracle SQL注入基础 在讨论具体的技术细节...

    Oracle dual详解

    ### Oracle Dual 表详解 #### 一、Oracle Dual 表简介 在Oracle数据库中,`DUAL`表是一个特殊的表,通常被用于执行简单的查询或计算。它只有一个行和一个列,该列名为`DUMMY`,其数据类型为`VARCHAR2(1)`,并且值...

    oracle_dual详解

    ### Oracle Dual 表详解 #### 一、Oracle Dual 表简介 在Oracle数据库中,`DUAL`表是一个特殊的表,通常用于查询那些不需要从实际数据表中获取的信息,例如系统时间、版本号等。虽然它看起来像是一个普通表,但其...

    oracle_dual详解.doc

    Oracle Dual表详解 在Oracle数据库中,`DUAL`是一个特殊的表,主要用于测试和获取系统信息,如当前日期和时间。它由Oracle系统拥有的`SYS`模式下的一个表,同时通过`PUBLIC SYNONYM`为所有数据库用户提供了公共访问...

    oracle数据库中有关dual的资料总结

    Oracle 中 Dual 表的应用和数据类型知识点总结 Dual 表是 Oracle 数据库中一个特殊的系统表,它是一个虚拟表,实际上不占用任何存储空间。Dual 表最常用的应用场景是执行一些简单的查询操作,例如获取当前用户、...

    10.Oracle虚表1

    Oracle数据库中的`dual`表是一个特殊的虚拟表,它的存在主要为了解决SQL语句的构造问题,尤其是当需要一个简单的上下文来执行表达式或函数时。由于`dual`表只包含一行且只有一个字段,因此它常被用于测试和演示目的...

    BLOG_Oracle_lhr_DUAL系列

    BLOG_Oracle_lhr_DUAL系列BLOG_Oracle_lhr_DUAL系列BLOG_Oracle_lhr_DUAL系列BLOG_Oracle_lhr_DUAL系列

    Oracle_Sql_中常用字符串处理函数

    示例:SELECT INSTR('oracle traning', 'ra', 1, 2) FROM dual; -- 返回 6 11. 字符串长度函数 LENGTH() Oracle Sql 提供了 LENGTH() 函数,用于返回字符串的长度。 示例:SELECT LENGTH('abcd') FROM dual; -- ...

    Oracle 9i Client (Oracle 9i 客户端) 简化版 (不安装Oracle客户端,也可以使用PLSQL Developer)

    Oracle 9i Client (Oracle 9i 客户端) 简化版 (不安装Oracle客户端,也可以使用PLSQL Developer 不用安装Oracle客户端也可以使用PLSQL Developer 绿色! 安全! 轻便! 可靠! 1、本软件可作为简单的Oracle9i客户端...

    基于C#连接Oracle数据库Oracle.ManagedDataAccess

    首先,Oracle.ManagedDataAccess是Oracle公司提供的一个纯.NET框架的客户端驱动,它允许开发者在不安装Oracle客户端的情况下,直接与Oracle数据库进行交互。这个库包含了所有必要的组件,使得C#程序可以方便地执行...

    ORACLE中CLOB字段转String类型

    ### ORACLE中CLOB字段转String类型 在Oracle数据库中,`CLOB`(Character Large Object)是一种用于存储大量文本数据的数据类型。由于其能够存储非常大的文本块(最大可达4GB),因此常被用于存储文章、报告或任何...

    Oracle 11.2.0.4 迁移到Oracle 12.2.0.1

    "Oracle 11.2.0.4 迁移到 Oracle 12.2.0.1 数据库迁移详细步骤" Oracle 数据库迁移是指从低版本的 Oracle 数据库迁移到高版本的 Oracle 数据库,例如从 Oracle 11g 迁移到 Oracle 12c。该过程需要按照数据库用户...

    oracle.jdbc.driver.oracledriver Oracle JDBC驱动包 ojdbc6

    Oracle JDBC驱动包是Oracle数据库与Java应用程序之间进行通信的关键组件,它使得Java程序员能够通过编写Java代码来操作Oracle数据库。标题中的"ojdbc6"指的是Oracle JDBC驱动的一个特定版本,适用于Java SE 6环境。...

    OracleClient-19C Oracle客户端,包括windows和Linux

    Oracle Client是Oracle公司提供的数据库连接工具,用于与Oracle数据库服务器进行通信。19C是Oracle Database的一个版本,代表第19个主要版本。这个压缩包包含的Oracle Client适用于Windows和Linux操作系统,使得...

    达梦和oracle的差异说明

    - **达梦数据库**:虽然在sysdba模式下有一个兼容Oracle的`DUAL`表,但新用户并没有这个表的同义词。因此,直接查询`DUAL`表会报错。解决方案是为当前用户创建一个`DUAL`的同义词,或者由管理员为所有用户创建一个...

    oracle10G和oracle11G的OCI.dll

    oci.dll是Oracle Call Interface的缩写,它是Oracle数据库的一个核心组件,允许开发者使用各种编程语言与Oracle数据库进行交互。在Oracle 10G和11G版本中,oci.dll扮演了至关重要的角色,为应用程序提供了访问数据库...

Global site tag (gtag.js) - Google Analytics