`
cenhonggang86830
  • 浏览: 45218 次
  • 性别: Icon_minigender_1
  • 来自: 大连
社区版块
存档分类
最新评论

【转载】学习之Dual表

阅读更多
最近在使用Oracle时遇到一个特殊的表Dual。想必了解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;



5:这条是自己加的。如果在使用一条SQL语句同时插入多条数据时也会用到Dual表。而且这个速度一定是比For循环插入数据要快很多。

    insert into 表名(字段1,字段2)

select '一','二' from dual        

union all                                

select '三','四' from dual        

union all                                

select '五','六' from dual        

union all                                

select '七','八' from dual        

union all                                

select '九','十' 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.

(转载:http://zhoujingxian.iteye.com/blog/494288)

分享到:
评论

相关推荐

    oracle之dual表的一些

    了解`DUAL`表的基本特性和使用方法对于Oracle数据库的学习和应用具有重要意义。然而,需要注意的是,尽管可以对`DUAL`表进行插入和删除操作,但在实际应用中应避免这样做,以免破坏数据的一致性和完整性。

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

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

    数据库表dual

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

    dual虚表 select语法规则

    "DUAL虚表SELECT语法规则" DUAL虚表是Oracle系统中一个特殊的表,它总是只有一条记录。这个表的存在使得我们可以使用SELECT语句来执行一些有趣的事情,如获取当前用户、系统时间、主机名、 locale、随机数、序列号...

    Oracle中的dual

    Dual 表的存在使得我们可以使用它来执行各种操作,以下是 Dual 表的一些应用场景: 1. 查看当前用户 使用 Dual 表我们可以很方便地查看当前用户的信息。例如,使用以下语句可以获取当前用户的名称: ```sql ...

    Dual Thrust量化策略源码

    Dual Thrust量化策略源码

    oracle_dual详解

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

    AMD Dual Driver.rar

    AMD Dual Driver是一款专门为AMD(Advanced Micro Devices)图形处理器设计的驱动程序,旨在优化电脑性能,提升游戏体验,并解决硬件兼容性问题。AMD是一家知名的半导体公司,其产品包括CPU(中央处理器)和GPU...

    机器学习之Dual SVM对偶支持向量机基本原理详解PPT

    对偶支持向量机(Dual SVM)是SVM理论中的一个重要概念,它为解决高维空间中的非线性问题提供了有效途径。 在原始的支持向量机问题中,我们尝试找到一个超平面,使得数据点到这个超平面的距离最大化,同时正确分类...

    oracle_dual详解.doc

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

    10.Oracle虚表1

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

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

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

    dual station_排名第二_K._DualThrust_增加了止损设置_空化_

    Chalek 在80 年代开发的 Dual Thrust。在自动化交易排名中,目前为止,仍然排名第二左右。详细资料,大家可以搜索网络对这方面的介绍。基本原理很简单,描述出来如下,这样不懂编程的人都可以明白:1. 在今天的收盘...

    DualThrust交易策略测试结果

    该策略的独特之处在于其动态的开仓与止损设定,既考虑了风险控制,又兼顾了盈利潜力。在本文中,我们将深入探讨DualThrust策略的原理,并结合提供的测试结果进行分析。 首先,DualThrust策略的基本构想是基于市场...

    Jquery双向select控件Bootstrap Dual Listbox

    Bootstrap Dual Listbox是一款基于jQuery和Bootstrap框架的双选列表控件,它为用户提供了便捷的方式来在两个选择框之间同步选项的选取。这个控件尤其适用于需要处理大量可选项目的场景,用户可以轻松地进行批量选择...

    Oracle dual详解

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

    jquery双列表框插件Bootstrap Dual Listbox

    Bootstrap Dual Listbox是一款基于jQuery的插件,专为Twitter Bootstrap框架设计,用于创建功能丰富的双列表框组件。这个插件使用户能够在两个并列的列表框之间方便地转移选择项,尤其适用于需要用户从多个选项中...

    【python股票量化】Dual-Thrust策略编程实现

    【python股票量化】Dual-Thrust策略编程实现

    jquery.dualListbox1.3 研究.zip

    《深入剖析jQuery_dualListbox1.3:一个高效双列选择框实现》 在Web开发领域,提升用户体验一直是开发者关注的重点。Bootstrap框架以其简洁、优雅的设计理念,深受开发者喜爱。而今天我们要探讨的是一个基于...

    DUAL有限状态机的个人总结

    DUAL有限状态机(FSM)是EIGRP(Enhanced Interior Gateway Routing Protocol,增强型内部网关路由协议)的核心算法之一,用于实现路由表的快速收敛。本文档旨在深入探讨DUAL FSM的工作原理及其在网络中的实际应用。...

Global site tag (gtag.js) - Google Analytics