`
touchmm
  • 浏览: 1030271 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

oracle dual table

 
阅读更多

1、DUAL表的用途
Dual 是 Oracle中的一个实际存在的表,任何用户均可读取,常用在没有目标表的Select语句块中

--查看当前连接用户
Connected to Oracle Database 10g Enterprise Edition Release 10.1.0.2.0
Connected as SYS

SQL> select user from dual;
USER
------------------------------
SYSTEM

--查看当前日期、时间
SQL> select systimestamp from dual;
SYSTIMESTAMP
--------------------------------------------------------------------------------
09-3月 -11 11.11.05.901000 上午 +08:00

SQL> select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss') from dual;
TO_CHAR(SYSDATE,'YYYY-MM-DDHH2
------------------------------
2011-03-09 11:12:03

--当作计算器用
SQL> select 1+2 from dual;
1+2
----------
3
--查看序列值
SQL> create sequence a increment by 1 start with 1;
Sequence created

SQL> select a.nextval from dual;
NEXTVAL
----------
1
SQL> select a.currval from dual;
CURRVAL
----------
1
SQL> drop sequence a;
Sequence dropped

2、关于DUAL表的测试与分析
DUAL就是个一行一列的表,如果你往里执行insert、delete、truncate操作,就会导致很多程序出问题。结果也因sql*plus、pl/sql dev等工具而异。
--查看DUAL是什么OBJECT

--DUAL是属于SYS schema的一个表,然后以PUBLIC SYNONYM的方式供其他数据库USER使用.
先格式化列标题和列数据的现实格式:
SQL> clear columns;
SQL> COLUMN owner HEADING FORMAT a10 WORD_WRAPPEND
SQL> COLUMN object_name HEADING FORMAT a15 WORD_WRAPPEND
SQL> COLUMN object_type HEADING FORMAT a15 WORD_WRAPPEND
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

SQL> clear columns;

--查看表结构,只有一个字段DUMMY,为VARCHAR2(1)型
SQL> desc dual;
Name Type Nullable Default Comments
----- ----------- -------- ------- --------
DUMMY VARCHAR2(1) Y

--DUAL表的结构:
create table SYS.DUAL
(
DUMMY VARCHAR2(1)
)
tablespace SYSTEM
pctfree 10
pctused 40
initrans 1
maxtrans 255
storage
(
initial 16K
next 16K
minextents 1
maxextents 505
pctincrease 50
);

/*
很是困惑,ORACLE为什么要用VARCHAR2(1)型,用CHAR(1)难道不好么?从这样的表结构来看,DUAL表设计的目的就是要尽可能的简单,以减少检索的开销。
还有,DUAL表是建立在SYSTEM表空间的,第一是因为DUAL表是SYS这个用户建的,本来默认的表空间就是SYSTEM;第二,把这个可能经常被查询的表和用户表分开来存放,对于系统性能的是有

好处的。
有了创建了表、创建了同义词还是不够的。DUAL在SYS这个Schema下面,因此用别的用户登录是无法查询这个表的,因此还需要授权:
grant select on SYS.DUAL to PUBLIC with grant option;
将Select 权限授予公众。
接下来看看DUAL表中的数据,事实上,DUAL表中的数据和ORACLE数据库环境有着十分重要的关系(ORACLE不会为此瘫痪,但是不少存储过程以及一些查询将无法被正确执行)。
*/

--查询行数
--在创建数据库之后,DUAL表中便已经被插入了一条记录。个人认为:DUMMY字段的值并没有什么关系,重要的是DUAL表中的记录数
SQL> select count(*) from dual;
COUNT(*)
----------
1

SQL> select * from dual;
DUMMY
-----
X

--使用PL/SQL Developer插入数据,能现实所有的数据。
SQL> insert into dual values('Y');
1 row inserted

SQL> insert into dual values('X');
1 row inserted

SQL> insert into dual values('Z');
1 row inserted

SQL> commit;
Commit complete

SQL> select * from dual;
DUMMY
-----
X
Y
X
Z

但是当我们执行下面语句时只显示一行:
SQL> select sysdate from dual;
SYSDATE
-----------
2011-3-9 12

SQL> select systimestamp from dual;
SYSTIMESTAMP
--------------------------------------------------------------------------------
09-3月 -11 12.10.23.073000 下午 +08:00

当system用户用oracle SQL*Plus登录后,执行相同的操作,显示插入数据成功,但是查询不了添加的数据,统计也只有一条数据,查看表中的所有数据,也只能看到原表中的数据'X'.

--把表截掉
SQL> truncate table dual;
Table truncated

SQL> commit;
Commit complete

然而,数据表里还有一条数据没有被删除,这是表里至少要有一条数据的原因。
SQL> select count(*) from dual;
COUNT(*)
----------
1

SQL> select * from dual;
no rows selected

但是下面这个语句还能成功:
SQL> select sysdate from dual;
SYSDATE
-----------
2011-3-9 12

--试着把DUAL表中的数据删除,看看会出现什么结果:
SQL> delete from dual;
1 row deleted

SQL> select * from dual;
no rows selected

SQL> select sysdate from dual;
SYSDATE
-----------
09-3月 -11

我们能取到系统日期。在以前的版本中是取不到系统日期的,据说原因是:sysdate是个函数,作用于每一个数据行。现在没有数据了,自然就不可能取出系统日期。但是10g版本中对此做了

修改,如果你对表中的数据进行全部删除,oracle也会保留一条空数据在表中的,这样便于你用这个dual表进行其他操作。

--对于DELETE操作来说,ORACLE对DUAL表的操作做了一些内部处理,尽量保证DUAL表中只返回一条记录.当然这写内部操作是不可见的
--不管表内有多少记录(没有记录除外),ORACLE对于每次DELETE操作都只删除了一条数据。
SQL> select count(*) from dual;
COUNT(*)
----------
4

SQL> delete from dual;
4 rows deleted

SQL> commit;
Commit complete

SQL> select count(*) from dual;
COUNT(*)
----------
1

附: ORACLE关于DUAL表不同寻常特性的解释
There is internalized code that makes this happen. Code checks that ensurethat 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

DUAL表可以执行插入、更新、删除操作,还可以执行drop操作。但是不要去执行drop表的操作,否则会使系统不能用,数据库起不了,会报Database startup crashes with ORA-1092错误。

3、如果DUAL表被“不幸”删除后的恢复:
用sys用户登陆。
创建DUAL表。
授予公众SELECT权限(SQL如上述,但不要给UPDATE,INSERT,DELETE权限)。
向DUAL表插入一条记录(仅此一条): insert into dual values('X');
提交修改。
--用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”
( “DUMMY” varchar2(1) )
pctfree 10 pctused 4;
SQL> insert into dual values(‘X’);
SQL> commit;
SQL> Grant select on dual to Public;
授权成功。

SQL> select * from dual;
D
-
X

SQL> shutdown immediate
数据库已经关闭。
已经卸载数据库。
ORACLE 例程已经关闭。
SQL> startup
ORACLE 例程已经启动。

Total System Global Area 135338868 bytes
Fixed Size 453492 bytes
Variable Size 109051904 bytes
Database Buffers 25165824 bytes
Redo Buffers 667648 bytes
数据库装载完毕。
数据库已经打开。

来源:http://wzhcn.spaces.live.com/blog/cns!FBA7EF989C66522E!515.entry?wa=wsignin1.0&sa=82576730

分享到:
评论

相关推荐

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

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

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

    CREATE TABLE SYS.DUAL ( DUMMY VARCHAR2(1) ); ``` DUAL 表的设计目的 DUAL 表的设计目的就是要尽可能的简单,以减少检索的开销。因此,DUAL 表使用 VARCHAR2(1) 类型,而不是 CHAR(1) 类型。这是因为 VARCHAR2(1)...

    Oracle dual详解

    SYS DUAL TABLE PUBLIC DUAL SYNONYM ``` ##### 2. DUAL 表的结构 `DUAL`表只有一个字段`DUMMY`,其数据类型为`VARCHAR2(1)`。 ``` SQL> DESC DUAL; Name Type Nullable Default Comments ------------------------...

    oracle sql of extracting table structure

    from DUAL union all select distinct lower(all_c.table_name) table_name --,(case -- when column_id || to_char(column_id) -- when column_id (column_id) -- when column_id > 100 then 'H' || ...

    Oracle练习.txt

    1.desc table_name 可以查询表的结构 2.怎么获取有哪些用户在使用数据库 select username from v$session; 3.如何在Oracle服务器上通过SQLPLUS查看本机IP地址 ? select sys_context('userenv','ip_address') from ...

    oracle和db2的区别

    ### Oracle与DB2的主要区别 本文旨在探讨Oracle与DB2这两种主流关系型数据库管理系统(RDBMS)之间的关键差异。Oracle由甲骨文公司开发,而DB2则由IBM推出。两者均广泛应用于企业级环境,提供了强大的数据管理能力。...

    oracle常用问题解答

    SELECT DBMS_METADATA.GET_DDL('TABLE', 'table_name') AS ddl FROM DUAL; ``` ##### 2.12 创建约束的索引在别的表空间上 **问题**: 如何在Oracle中创建约束的索引在别的表空间上? **解答**: 在创建约束时,...

    Oracle给用户授权truncatetable的实现方案

    开发说在用dwetl下执行调用shop用户下的表的时候提示没有权限操作,google了查了下,发现oracle账户没法直接赋予对某个表的truncate权限,那要怎么来实现呢? 在shop用户下面,准备测试数据 SQL> create table Z_...

    oracle与db2对比

    - Oracle:`SELECT SYSDATE FROM DUAL;` - DB2:`SELECT CURRENT TIMESTAMP FROM SYSIBM.SYSDUMMY1;` 3. 空值转换: - Oracle:`SELECT productid, loginname, NVL(cur_rate, '0') FROM TableName;` - DB2:`...

    Oracle客户端连接Oracle服务器.docx

    `,`DUAL`表是一个虚拟表,通常用于测试SQL语句。 5. **Oracle远程连接数据库**: - Oracle远程连接通常涉及到TNS(Transparent Network Substrate)配置,包括`tnsnames.ora`文件,其中定义了连接到数据库的服务...

    ORACLE转DB2对照全解

    **注意:** Oracle中的`DUAL`表相当于DB2中的`SYSIBM.SYSDUMMY1`表,用于查询单个值。 #### 十六、时间日期函数 **Oracle:** ```sql SELECT SYSDATE FROM DUAL; ``` **DB2:** ```sql SELECT CURRENT_TIMESTAMP ...

    Oracle数据库学习指南

    2. Dual伪列 3. EXP、IMP 命令详解 4. Exp-Imp大量数据 5. Export-Import 使用技巧与常见错误 6. NULL 使用详解 7. Oracle for NT系统实用工具介绍 8. Oracle 和 mysql 的一些简单命令对比参照 9. Oracle8i和...

    oracle判断表名是否存在

    在Oracle数据库中,判断表名是否存在是常见的数据库管理任务,这通常涉及到SQL查询或使用数据库的系统视图。以下是一些关于如何在Oracle中检查表是否存在的方法。 首先,你可以使用`ALL_TABLES`或`USER_TABLES`系统...

    oracle实现阶梯式累加

    CREATE TABLE SALARY AS SELECT 'A' NAME, 10 DEPT, 1000 SALARY FROM DUAL UNION ALL SELECT 'B', 10, 2000 FROM DUAL UNION ALL SELECT 'C', 20, 1500 FROM DUAL UNION ALL SELECT 'D', 20, 3000 FROM DUAL UNION ...

    Oracle查询语句大全-精华版

    select 'Welcome to visit'||chr(10)||'www.CSDN.NET' from dual; 二十一、查询数据文件的大小 查询数据文件的大小是使用 Oracle 的一个基本操作,使用以下语句可以查询数据文件的大小: select tablespace_name ...

    Oracle插入数据时获取自增ID

    SELECT seq_atable.CURRVAL FROM dual; ``` 需要注意的是,`CURRVAL`只能在一个会话内有效,即在同一个会话中,`CURRVAL`返回的值只对最近一次调用`NEXTVAL`的序列有效。这意味着如果你在同一事务中多次插入数据,...

    ORACLE 常用SQL语句

    例如,Select Instr('Oracle Traning','Ra',1,2) From Dual; 将返回 6,表示字符串 ‘Ra’ 在 ‘Oracle Traning’ 中的位置。 6. LENGTH 函数 LENGTH 函数返回字符串的长度。例如,Select Length(Name) From ....

    oracle常用语法概述

    ### Oracle常用语法概述 Oracle是一种广泛使用的数据库管理系统,在企业级应用中非常常见。本文将详细介绍Oracle数据库中的几个关键概念和语法用法,帮助初学者更好地理解和掌握Oracle。 #### 变量声明与赋值 在...

Global site tag (gtag.js) - Google Analytics