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

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.

分享到:
评论
发表评论

文章已被作者锁定,不允许评论。

相关推荐

    oracle之dual表的一些

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

    oracle_dual详解.doc

    让我们深入了解`DUAL`表的特性和使用方法。 首先,`DUAL`表只有一个字段,名为`DUMMY`,类型为`VARCHAR2(1)`,并且默认值为`'X'`。通常,我们使用`DUAL`表来获取当前系统日期,例如: ```sql SELECT sysdate FROM ...

    oracle 不存在dual情况下注入.doc

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

    Oracle dual详解

    ### Oracle Dual 表详解 #### 一、Oracle Dual 表简介 在Oracle数据库中,`DUAL`表是一个特殊的表,通常被用于执行简单的查询或计算。...对于Oracle数据库的初学者来说,掌握`DUAL`表的使用方法是非常有帮助的。

    oracle中 substring函数的使用

    ### Oracle中的SUBSTR函数详解 在Oracle数据库中,`SUBSTR`函数是一个非常重要的字符串处理函数,用于从指定的字符串中提取子串。该函数在实际应用中极为广泛,能够帮助用户灵活地处理数据,满足各种业务需求。下面...

    如何为oracle中的表增加自动增长列.pdf

    在Oracle数据库中,表的自动增长列通常是指使用序列(SEQUENCE)或者使用Oracle提供的自动增长数据类型(例如:IDENTITY或者GENERATED AS IDENTITY),以实现表中某列值能够随着记录的增加而自动递增。本文将介绍...

    Oracle 表空间 收缩

    - **表空间**(Tablespace):Oracle数据库中的逻辑存储单元,由一个或多个数据文件组成。 - **数据文件**(Data File):表空间的具体物理实现,每个表空间至少包含一个数据文件。 - **段**(Segment):表空间中...

    关于oracle自带的表

    文档中提到了多个 SQL 函数的使用方法: 1. **字符串处理函数** - **`lower(ename)`**: 将 `ename` 字段转换为小写。 - **`substr(ename, 2, 3)`**: 从 `ename` 的第二个字符开始提取三个字符。 - **`char(65)`*...

    Oracle的表结构转成Mysql的表结构

    本文介绍了一种将Oracle数据库中的表结构转换为MySQL数据库表结构的方法。通过编写一个PL/SQL函数`fnc_table_to_mysql`来实现这一目标。该函数可以接受四个参数,并生成对应的MySQL创建表语句(DDL)。 #### 参数...

    创建oracle数据库中表的主键和自增

    ### 创建Oracle数据库中表的主键和自增 在Oracle数据库中实现自增主键是一项常见但非常重要的功能。这不仅有助于确保数据的唯一性,还能简化开发过程中的某些环节,尤其是在需要自动增长的主键时。下面将详细介绍...

    Oracle常用函数和使用方法

    本文将详细介绍Oracle中一些最常用的函数及其使用方法,这些函数包括`DECODE`、`ABS`、`CEIL`、`MOD`、`ROUND`、`TRUNC`、`CONCAT`、`LOWER`和`LPAD`。 #### 二、DECODE函数:条件判断与转换 **功能描述**:`...

    ORACLE中CLOB字段转String类型

    ### ORACLE中CLOB字段转String类型 在Oracle数据库中,`CLOB`(Character Large Object)是一种用于存储大量文本数据的数据类型。由于其能够存储非常大的文本块(最大可达4GB),因此常被用于存储文章、报告或任何...

    ORACLE中科学计数法显示问题的解决

    在 Oracle 中,默认情况下,数字类型的数据显示格式为科学计数法,这会导致数字显示不正确,例如 select to_number('12345678912') from dual; 结果会显示为 1.2346E+10,而不是我们期望的 12345678912。这种情况在 ...

    oracle4的表查询和基本函数.docx

    本文将深入探讨Oracle4中的表查询和基本函数。 首先,我们关注的是基本查询。在Oracle中,查询多表通常涉及到联接操作。以示例中的雇员表(EMP)和部门表(DEPT)为例,我们可以使用JOIN语句来获取雇员及其所在部门...

    oracle 查看表空间使用情况

    首先,我们可以通过SQL查询来查看Oracle数据库中所有表空间的大小和使用情况。以下SQL语句用于获取表空间名、总大小、已使用空间、空闲空间以及使用比例: ```sql SELECT a.tablespace_name "表空间名", a.bytes /...

    oracle中substr函数详细用法

    在Oracle数据库中,`SUBSTR`和`INSTR`函数是非常重要的字符串处理函数,它们在数据操作和查询中发挥着关键作用。本文将详细介绍这两个函数的用法,并结合`CASE WHEN`语句来解决特定的问题。 `SUBSTR`函数用于从一个...

    Oracle存储过程和函数(最详细包含emp 表实例操作,边看边操作)

    SCOTT库是Oracle数据库中的一个示例数据库,包含多个表,其中最知名的是`EMP`表。`EMP`表通常用于教学目的,因为它包含了一些基本的员工数据,如员工编号(EMPNO)、员工姓名(ENAME)、职位(JOB)、薪水(SAL)等...

    XML导入Oracle表

    在Oracle数据库中,XML数据可以被导入到表中以便进行存储和处理。本篇文章将详细介绍两种XML数据导入Oracle表的方法。 方法之一:使用SQL*Loader SQL*Loader是Oracle提供的一款强大的数据加载工具,它可以处理大量...

    Oracle数据库创建表tuser设置主键自动增长

    在Oracle数据库中,创建一张包含自动增长主键的表是一项常见的需求。本文将详细介绍如何在Oracle环境中创建一个名为`tuser`的表,并实现其主键自动增长的功能。此外,还将介绍如何通过序列(sequence)来管理这个自动...

Global site tag (gtag.js) - Google Analytics