dual是一个虚拟表,用来构成select的语法规则,oracle保证dual里面永远只有一条记录。我们可以用它来做很多事情,如下:
1、查看当前用户,可以在 SQL Plus中执行下面语句 select user from dual;
2、用来调用系统函数
select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss') from dual;--获得当前系统时间
select SYS_CONTEXT('USERENV','TERMINAL') from dual;--获得主机名
select SYS_CONTEXT('USERENV','language') from dual;--获得当前 locale
select dbms_random.random from dual;--获得一个随机数
3、得到序列的下一个值或当前值,用下面语句
select your_sequence.nextval from dual;--获得序列your_sequence的下一个值
select your_sequence.currval from dual;--获得序列your_sequence的当前值
4、可以用做计算器 select 7*9 from dual;
------
Oracle系统中dual表是一个“神秘”的表,网上有很多网友都对该表进行了测试,该表只有一行一列,其实该表和系统中的其他表一样,一样可以执行插入、更新、删除操作,还可以执行drop操作。但是不要去执行drop表的操作,否则会使系统不能用,数据库起不了,会报Database startup crashes with ORA-1092错误。此时也不要慌乱,可以通过执行以下步骤来进行恢复。可以用sys用户登陆。
SQL> create pfile=’d:pfile.bak’ from spfile
SQL> shutdown immediate
在d:pfile.bak文件中最后加入一条:
replication_dependency_tracking = FALSE
重新启动数据库:
SQL> startup pfile=’d:pfile.bak’
SQL> create table “sys”.”DUAL”
[an error occurred while processing this directive]
=====
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.
from http://blog.csdn.net/dxz_1983/article/details/2632564
分享到:
相关推荐
DUAL 表的用途非常广泛,常用在没有目标表的 Select 语句块中。下面都是 DUAL 表的一些常见使用场景: 查看当前连接用户 使用 DUAL 表可以查看当前连接用户,语句如下: ```sql SELECT USER FROM DUAL; ``` 查看...
`DUAL`表是Oracle数据库中的一个预定义只读表,主要用途是执行单行计算或返回固定值。这个表非常简单,仅包含一行数据和一个名为`DUMMY`的列,其值为`X`。因此,在进行各种测试或者查询操作时,我们通常会利用`DUAL`...
Oracle数据库中的`dual`表是一个特殊的虚拟表,它的存在主要为了解决SQL语句的构造问题,尤其是当需要一个简单的上下文来执行表达式或函数时。由于`dual`表只包含一行且只有一个字段,因此它常被用于测试和演示目的...
`DUAL`表是Oracle数据库中的一个特殊表,它的主要用途在于支持简单的查询与计算任务。通过本文的介绍,我们可以了解到`DUAL`表的基本用法、内部结构以及设计原理等内容。对于Oracle数据库的初学者来说,掌握`DUAL`表...
Dual表是Oracle数据库中一个特殊的表,它是Oracle数据库中自带的表,由 SYS 模式所有,所有用户都可以访问它。Dual表只有一个列:DUMMY,其数据类型为VARCHAR2(1),表中只有一行数据:'X'。 Dual表的主要用途是: ...
在Oracle数据库管理系统中,查询用户所有表的相关信息是一项常见的操作,这对于数据库管理和开发工作至关重要。本文将详细解释如何使用SQL语句来实现这一目标,并提供一些相关的查询技巧。 首先,我们来看两个主要...
**问题**: Oracle中的SYS_CONTEXT函数有何用途? **解答**: `SYS_CONTEXT`函数允许访问Oracle环境中的上下文信息,例如会话变量、服务器参数等。它常用于获取当前会话的信息。 - **示例**: 获取当前用户的名称: ``...
尽管看起来DUAL表被插入了一行,然后又删除了,但在Oracle中DUAL表始终只有一行。所以,无论执行多少次插入和删除,`SELECT COUNT(*) FROM DUAL` 总是返回1。 4. 数据抽象方法包括分类、聚集、概括。在E-R模型中,...
### ORACLE CRC32函数详解 ...通过以上介绍,我们可以了解到Oracle数据库中`CRC32`函数的强大之处及其在实际应用中的广泛用途。它不仅能够帮助我们有效地进行数据校验和去重,还能在一定程度上提高系统的整体性能。
Oracle数据库系统中,伪列和伪表是两个特殊的概念,它们为数据库操作提供了额外的功能和便利。本文将详细探讨这两个概念及其应用场景。 首先,我们来理解什么是伪列。伪列并非用户在创建表时定义的列,而是Oracle...
22. NULL和DUAL详解讨论了Oracle中的空值概念,以及特殊的虚拟表DUAL的用途。 23. 时间、数字、字符格式详解,涉及格式化和解析不同数据类型时使用的各种格式。 24. Oracle字符集问题讨论了字符编码和字符集对...
Oracle数据库系统中,伪列和伪表是其特有的概念,用于增强数据库的功能和操作灵活性。伪列不是用户在创建表时定义的列,而是Oracle系统自动生成的特殊列,它们提供了额外的信息或功能。以下是关于Oracle伪列和伪表的...
**Oracle**中有一个特殊的“DUAL”表,常用于测试或执行简单的SQL查询。而在**PostgreSQL**中,可以通过创建一个视图(`VIEW`)来模拟这个行为,确保跨数据库的程序兼容性。 ### 5. 关联查询差异 - **Oracle**支持...
Oracle数据库是全球广泛使用的大型关系型数据库管理系统,其在...理解DUAL表的用途、NULL值的特性以及各种函数的使用方式,将有助于我们在软件开发过程中更好地设计和优化数据库操作,从而提高应用程序的性能和稳定性。
- DUAL表是一个特殊的虚拟表,在Oracle中经常被用作测试和演示用途。 - 可以通过查询DUAL表来进行简单的计算或测试SQL语法结构,例如`SELECT 1+1 FROM DUAL;`。 4. **SQL查询**: - 基础的SELECT语句,如`SELECT...
Oracle数据库DBA(Database Administrator)是负责Oracle数据库系统运行管理的专业技术人员。在准备面试Oracle数据库管理员岗位时,掌握相关的技术知识和处理问题的能力是非常重要的。以下是针对给定的Oracle数据库...
### Oracle中的Sequence...通过以上步骤,我们可以看到Sequence在Oracle数据库中的强大功能和广泛用途,不仅能够方便地实现主键自增,还能灵活生成各种类型的序列号。这对于日常的数据处理工作来说是非常实用的工具。
- **Dual**是Oracle中的一个特殊表,通常用于返回单行结果或测试某些函数。 - **操作示例**: - 显示表的结构:`DESC table_name;` - 查询系统日期:`SELECT SYSDATE FROM dual;` - 计算数学表达式:`SELECT 1 + ...
在Oracle数据库中,绑定变量的使用对于提升SQL执行效率至关重要。若不使用绑定变量,尤其是来自Java等应用程序的SQL语句,会导致大量硬解析(Hard Parse),即数据库必须为每个不同的SQL文本创建新的解析计划,这不仅...