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

Oracle中dual表的用途

 
阅读更多

 

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

分享到:
评论

相关推荐

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

    DUAL 表的用途非常广泛,常用在没有目标表的 Select 语句块中。下面都是 DUAL 表的一些常见使用场景: 查看当前连接用户 使用 DUAL 表可以查看当前连接用户,语句如下: ```sql SELECT USER FROM DUAL; ``` 查看...

    oracle之dual表的一些

    `DUAL`表是Oracle数据库中的一个预定义只读表,主要用途是执行单行计算或返回固定值。这个表非常简单,仅包含一行数据和一个名为`DUMMY`的列,其值为`X`。因此,在进行各种测试或者查询操作时,我们通常会利用`DUAL`...

    10.Oracle虚表1

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

    Oracle dual详解

    `DUAL`表是Oracle数据库中的一个特殊表,它的主要用途在于支持简单的查询与计算任务。通过本文的介绍,我们可以了解到`DUAL`表的基本用法、内部结构以及设计原理等内容。对于Oracle数据库的初学者来说,掌握`DUAL`表...

    数据库表dual

    Dual表是Oracle数据库中一个特殊的表,它是Oracle数据库中自带的表,由 SYS 模式所有,所有用户都可以访问它。Dual表只有一个列:DUMMY,其数据类型为VARCHAR2(1),表中只有一行数据:'X'。 Dual表的主要用途是: ...

    oracle查用户所有表

    在Oracle数据库管理系统中,查询用户所有表的相关信息是一项常见的操作,这对于数据库管理和开发工作至关重要。本文将详细解释如何使用SQL语句来实现这一目标,并提供一些相关的查询技巧。 首先,我们来看两个主要...

    oracle常用问题解答

    **问题**: Oracle中的SYS_CONTEXT函数有何用途? **解答**: `SYS_CONTEXT`函数允许访问Oracle环境中的上下文信息,例如会话变量、服务器参数等。它常用于获取当前会话的信息。 - **示例**: 获取当前用户的名称: ``...

    Oracle面试题收集

    尽管看起来DUAL表被插入了一行,然后又删除了,但在Oracle中DUAL表始终只有一行。所以,无论执行多少次插入和删除,`SELECT COUNT(*) FROM DUAL` 总是返回1。 4. 数据抽象方法包括分类、聚集、概括。在E-R模型中,...

    ORACLE CRC32函数

    ### ORACLE CRC32函数详解 ...通过以上介绍,我们可以了解到Oracle数据库中`CRC32`函数的强大之处及其在实际应用中的广泛用途。它不仅能够帮助我们有效地进行数据校验和去重,还能在一定程度上提高系统的整体性能。

    oracle伪列以及伪表.docx

    Oracle数据库系统中,伪列和伪表是两个特殊的概念,它们为数据库操作提供了额外的功能和便利。本文将详细探讨这两个概念及其应用场景。 首先,我们来理解什么是伪列。伪列并非用户在创建表时定义的列,而是Oracle...

    Oracle高级sql学习与练习

    22. NULL和DUAL详解讨论了Oracle中的空值概念,以及特殊的虚拟表DUAL的用途。 23. 时间、数字、字符格式详解,涉及格式化和解析不同数据类型时使用的各种格式。 24. Oracle字符集问题讨论了字符编码和字符集对...

    oracle伪列以与伪表.doc

    Oracle数据库系统中,伪列和伪表是其特有的概念,用于增强数据库的功能和操作灵活性。伪列不是用户在创建表时定义的列,而是Oracle系统自动生成的特殊列,它们提供了额外的信息或功能。以下是关于Oracle伪列和伪表的...

    PostgreSQL和Oracle区别

    **Oracle**中有一个特殊的“DUAL”表,常用于测试或执行简单的SQL查询。而在**PostgreSQL**中,可以通过创建一个视图(`VIEW`)来模拟这个行为,确保跨数据库的程序兼容性。 ### 5. 关联查询差异 - **Oracle**支持...

    Oracle课程小结[定义].pdf

    Oracle数据库是全球广泛使用的大型关系型数据库管理系统,其在...理解DUAL表的用途、NULL值的特性以及各种函数的使用方式,将有助于我们在软件开发过程中更好地设计和优化数据库操作,从而提高应用程序的性能和稳定性。

    oracle安装文件.docx

    - DUAL表是一个特殊的虚拟表,在Oracle中经常被用作测试和演示用途。 - 可以通过查询DUAL表来进行简单的计算或测试SQL语法结构,例如`SELECT 1+1 FROM DUAL;`。 4. **SQL查询**: - 基础的SELECT语句,如`SELECT...

    Oracle数据库DBA面试题50道及答案.pdf

    Oracle数据库DBA(Database Administrator)是负责Oracle数据库系统运行管理的专业技术人员。在准备面试Oracle数据库管理员岗位时,掌握相关的技术知识和处理问题的能力是非常重要的。以下是针对给定的Oracle数据库...

    oracle中sequence介绍及应用

    ### Oracle中的Sequence...通过以上步骤,我们可以看到Sequence在Oracle数据库中的强大功能和广泛用途,不仅能够方便地实现主键自增,还能灵活生成各种类型的序列号。这对于日常的数据处理工作来说是非常实用的工具。

    Oracle数据库实验报告

    - **Dual**是Oracle中的一个特殊表,通常用于返回单行结果或测试某些函数。 - **操作示例**: - 显示表的结构:`DESC table_name;` - 查询系统日期:`SELECT SYSDATE FROM dual;` - 计算数学表达式:`SELECT 1 + ...

    ORACLE 合辑

    在Oracle数据库中,绑定变量的使用对于提升SQL执行效率至关重要。若不使用绑定变量,尤其是来自Java等应用程序的SQL语句,会导致大量硬解析(Hard Parse),即数据库必须为每个不同的SQL文本创建新的解析计划,这不仅...

Global site tag (gtag.js) - Google Analytics