ORACLE中dual的使用和详解

1.我们先从名称来说,dual不是缩写词,本身就是完整的单词。dual名词意思是对数,做形容词时是指二重的,二元的。
2.Oracle中的dual表是一个单行单列的虚拟表。
3.Dual表是oracle与数据字典一起自动创建的一个表,这个表只有1列:DUMMY,数据类型为VERCHAR2(1),dual表中只有一个数据'X', Oracle有内部逻辑保证dual表中永远只有一条数据。4.Dual表主要用来选择系统变量或求一个表达式的值。
5.更具体的说,我们见过这样一个简单的例子:
<wbr style="color:rgb(50,62,50); font-family:simsun; line-height:21px"><span style="color:rgb(50,62,50); font-family:simsun; line-height:21px"></span><wbr style="color:rgb(50,62,50); font-family:simsun; line-height:21px"><span style="color:rgb(50,62,50); font-family:simsun; line-height:21px"></span><wbr style="color:rgb(50,62,50); font-family:simsun; line-height:21px"><span style="color:rgb(50,62,50); font-family:simsun; line-height:21px"></span><wbr style="color:rgb(50,62,50); font-family:simsun; line-height:21px"><span style="color:rgb(50,62,50); font-family:simsun; line-height:21px"></span><wbr style="color:rgb(50,62,50); font-family:simsun; line-height:21px"><span style="color:rgb(50,62,50); font-family:simsun; line-height:21px">SELECT sysdate FROM daul</span><br style="color:rgb(50,62,50); font-family:simsun; line-height:21px"><span style="color:rgb(50,62,50); font-family:simsun; line-height:21px"></span><wbr style="color:rgb(50,62,50); font-family:simsun; line-height:21px"><span style="color:rgb(50,62,50); font-family:simsun; line-height:21px"></span><wbr style="color:rgb(50,62,50); font-family:simsun; line-height:21px"><span style="color:rgb(50,62,50); font-family:simsun; line-height:21px"></span><wbr style="color:rgb(50,62,50); font-family:simsun; line-height:21px"><span style="color:rgb(50,62,50); font-family:simsun; line-height:21px">而Oracle的SELECT语法的限制为:</span><br style="color:rgb(50,62,50); font-family:simsun; line-height:21px"><span style="color:rgb(50,62,50); font-family:simsun; line-height:21px">SELECT * | [column1 [AS alias1], column2 [AS alias2]] FROM table</span><br style="color:rgb(50,62,50); font-family:simsun; line-height:21px"><br style="color:rgb(50,62,50); font-family:simsun; line-height:21px"><span style="color:rgb(50,62,50); font-family:simsun; line-height:21px">所以,没有表名就没有办法查询,而时间日期并不存放在任何表中,于是这个dual虚拟表的概念就被引入了。</span><br style="color:rgb(50,62,50); font-family:simsun; line-height:21px"><br style="color:rgb(50,62,50); font-family:simsun; line-height:21px"></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>
1、DUAL表的用途
Dual 是 Oracle中的一个实际存在的表,任何用户均可读取,常用在没有目标表的Select语句块中
--查看当前连接用户
SQL> select user from dual;
USER
------------------------------
SYSTEM
--查看当前日期、时间
SQL> select sysdate from dual;
SYSDATE
-----------
2007-1-24 1
SQL> select to_char(sysdate,''yyyy-mm-dd hh24:mi:ss'') from dual;
TO_CHAR(SYSDATE,''YYYY-MM-DDHH2
------------------------------
2007-01-24 15:02:47
--当作计算器用
SQL> select 1+2 from dual;
1+2
----------
3
--查看序列值
SQL> create sequence aaa increment by 1 start with 1;
SQL> select aaa.nextval from dual;
NEXTVAL
----------
1
SQL> select aaa.currval from dual;
CURRVAL
----------
1

2、关于DUAL表的测试与分析
DUAL就是个一行一列的表,如果你往里执行insert、delete、truncate操作,就会导致很多程序出问题。结果也因sql*plus、pl/sql dev等工具而异。
--查看DUAL是什么OBJECT
--DUAL是属于SYS schema的一个表,然后以PUBLIC SYNONYM的方式供其他数据库USER使用.
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

--查看表结构,只有一个字段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
);



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

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

--插入数据,再查询记录,只返回一行记录
SQL> insert into dual values (''Y'');
1 row created.
SQL> commit;
Commit complete.
SQL> insert into dual values (''X'');
1 row created.
SQL> insert into dual values (''Z'');
1 row created.
SQL> commit;
Commit complete.
SQL> select count(*) from dual;
COUNT(*)
----------
4
SQL> select * from dual;
DUMMY
-----
X



--把表截掉
SQL> truncate table dual;
Table truncated.
SQL> select count(*) from dual;
COUNT(*)
----------
0
SQL> select * from dual;
no rows selected
SQL> select sysdate from dual;
no rows selected

--试着把DUAL表中的数据删除,看看会出现什么结果:
SQL> delete from dual;
1 行 已删除
SQL> select * from dual;
DUMMY
-----
SQL> select sysdate from dual;
SYSDATE
-----------


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



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
数据库装载完毕。
数据库已经打开。
SQL>

--OK, 下面就可以正常使用了。
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值