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
分享到:
相关推荐
### Oracle之DUAL表的理解与应用 #### 一、引言 在Oracle数据库环境中,`DUAL`表是一个特殊的表,被广泛应用于多种查询场景之中。本文将从多个角度深入探讨`DUAL`表的特性及其应用场景,帮助读者更好地理解和掌握这...
### Oracle Dual 表详解 #### 一、Oracle Dual 表简介 在Oracle数据库中,`DUAL`表是一个特殊的表,通常被用于执行简单的查询或计算。它只有一个行和一个列,该列名为`DUMMY`,其数据类型为`VARCHAR2(1)`,并且值...
### Oracle Dual 表详解 #### 一、Oracle Dual 表简介 在Oracle数据库中,`DUAL`表是一个特殊的表,通常用于查询那些不需要从实际数据表中获取的信息,例如系统时间、版本号等。虽然它看起来像是一个普通表,但其...
Oracle Dual表详解 在Oracle数据库中,`DUAL`是一个特殊的表,主要用于测试和获取系统信息,如当前日期和时间。它由Oracle系统拥有的`SYS`模式下的一个表,同时通过`PUBLIC SYNONYM`为所有数据库用户提供了公共访问...
根据提供的文档标题、描述、标签以及部分内容,本文将围绕Oracle数据库中的SQL注入技术进行深入解析,特别是当目标系统中不存在`dual`表时如何进行有效的数据挖掘。 ### Oracle SQL注入基础 在讨论具体的技术细节...
Oracle 数据库中 DUAL 表的使用 DUAL 表是 Oracle 数据库中一个特殊的表,它是任何用户都可以读取的公共表。DUAL 表的用途非常广泛,常用在没有目标表的 Select 语句块中。下面都是 DUAL 表的一些常见使用场景: ...
Oracle 中的 Dual Dual 是 Oracle 中的一个虚拟表,用于构成 SELECT 语句的语法规则。 Oracle 保证 Dual 表中永远只有一条记录。Dual 表的存在使得我们可以使用它来执行各种操作,以下是 Dual 表的一些应用场景: ...
Oracle 中 Dual 表的应用和数据类型知识点总结 Dual 表是 Oracle 数据库中一个特殊的系统表,它是一个虚拟表,实际上不占用任何存储空间。Dual 表最常用的应用场景是执行一些简单的查询操作,例如获取当前用户、...
Oracle数据库中的`dual`表是一个特殊的虚拟表,它的存在主要为了解决SQL语句的构造问题,尤其是当需要一个简单的上下文来执行表达式或函数时。由于`dual`表只包含一行且只有一个字段,因此它常被用于测试和演示目的...
BLOG_Oracle_lhr_DUAL系列BLOG_Oracle_lhr_DUAL系列BLOG_Oracle_lhr_DUAL系列BLOG_Oracle_lhr_DUAL系列
示例: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 数据库迁移是指从低版本的 Oracle 数据库迁移到高版本的 Oracle 数据库,例如从 Oracle 11g 迁移到 Oracle 12c。该过程需要按照数据库用户...
- **达梦数据库**:虽然在sysdba模式下有一个兼容Oracle的`DUAL`表,但新用户并没有这个表的同义词。因此,直接查询`DUAL`表会报错。解决方案是为当前用户创建一个`DUAL`的同义词,或者由管理员为所有用户创建一个...
- **Oracle**: 需要使用 `SELECT 'a' FROM DUAL;`。这里,`DUAL` 是一个特殊的单行表,用于查询单个值或表达式。 #### 四、字符串连接符 - **PostgreSQL** 和 **Oracle** 都使用 `||` 作为字符串连接符。 - **...
### Oracle与DB2的主要区别 本文旨在探讨Oracle与DB2这两种主流关系型数据库管理系统(RDBMS)之间的关键差异。Oracle由甲骨文公司开发,而DB2则由IBM推出。两者均广泛应用于企业级环境,提供了强大的数据管理能力。...
### Oracle实现阶梯式累加 在Oracle数据库中,实现阶梯式累加是一种常见的需求,尤其在处理财务数据、员工薪资统计等场景时尤为突出。本文将详细介绍如何利用Oracle数据库特有的功能来实现阶梯式累加,并通过一个...
`,`DUAL`表是一个虚拟表,通常用于测试SQL语句。 5. **Oracle远程连接数据库**: - Oracle远程连接通常涉及到TNS(Transparent Network Substrate)配置,包括`tnsnames.ora`文件,其中定义了连接到数据库的服务...
### Oracle日期查询相关知识点 #### 一、获取系统当前日期与时间 在Oracle数据库中,可以通过`SYSDATE`函数来获取系统的当前日期和时间。这是一个非常实用的功能,尤其是在需要记录数据的操作时间点时。 **示例:...