`
Virgo_S
  • 浏览: 1150926 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

ORACLE DUAL

阅读更多
DUAL ? 有什么神秘的? 当你想得到ORACLE系统时间, 简简单单敲一行SQL
SQL> select sysdate from dual;  
  SYSDATE  
  ---------  
  28-SEP-03  
  哈哈, 确实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 
分享到:
评论
1 楼 longzhu007 2009-05-31  
mysql里的dual和oracle  的差别大吗

相关推荐

    oracle之dual表的一些

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

    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情况下注入.doc

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

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

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

    Oracle中的dual

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

    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 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的差异说明

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

    pg与oracle语法差异

    - **Oracle**: 需要使用 `SELECT 'a' FROM DUAL;`。这里,`DUAL` 是一个特殊的单行表,用于查询单个值或表达式。 #### 四、字符串连接符 - **PostgreSQL** 和 **Oracle** 都使用 `||` 作为字符串连接符。 - **...

    oracle和db2的区别

    ### Oracle与DB2的主要区别 本文旨在探讨Oracle与DB2这两种主流关系型数据库管理系统(RDBMS)之间的关键差异。Oracle由甲骨文公司开发,而DB2则由IBM推出。两者均广泛应用于企业级环境,提供了强大的数据管理能力。...

    oracle实现阶梯式累加

    ### Oracle实现阶梯式累加 在Oracle数据库中,实现阶梯式累加是一种常见的需求,尤其在处理财务数据、员工薪资统计等场景时尤为突出。本文将详细介绍如何利用Oracle数据库特有的功能来实现阶梯式累加,并通过一个...

    Oracle客户端连接Oracle服务器.docx

    `,`DUAL`表是一个虚拟表,通常用于测试SQL语句。 5. **Oracle远程连接数据库**: - Oracle远程连接通常涉及到TNS(Transparent Network Substrate)配置,包括`tnsnames.ora`文件,其中定义了连接到数据库的服务...

    oracle日期查询相关

    ### Oracle日期查询相关知识点 #### 一、获取系统当前日期与时间 在Oracle数据库中,可以通过`SYSDATE`函数来获取系统的当前日期和时间。这是一个非常实用的功能,尤其是在需要记录数据的操作时间点时。 **示例:...

Global site tag (gtag.js) - Google Analytics