oracle中的dual表简介

一、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;
#获得当前 locale
select SYS_CONTEXT('USERENV','language') from dual;
#获得一个随机数
select dbms_random.random from dual;


3、得到序列的下一个值或当前值,用下面语句


#获得序列your_sequence的下一个值
select your_sequence.nextval from dual;
#获得序列your_sequence的当前值
select your_sequence.currval from dual;


4、可以用做计算器


select 1+2 from dual;


二、dual表的表结构解析

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
);


1、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


2、查看表结构,只有一个字段DUMMY,为VARCHAR2(1)型。


SQL> desc dual
Name         Type                 Nullable Default Comments
---------------------------------------------------------------------------
DUMMY     VARCHAR2(1)      Y


3、dual在SYS这个Schema下面,因此用别的用户登录是无法查询这个表的,所以dual表必定经过以下授权。


grant select on SYS.DUAL to PUBLIC with grant option;


4、在创建数据库之后,DUAL表中便已经被插入了一条记录。个人认为:DUMMY字段的值并没有什么关系,重要的是DUAL表中的记录数。


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

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


5、插入数据,再查询记录,只返回一行记录。


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


6、对于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表被删除后如何恢复

dual表可以执行插入、更新、删除操作,还可以执行drop操作。但是不要去执行drop表的操作,否则会使系统不能用,数据库起不了,会报Database startup crashes with ORA-1092错误。dual表被“不幸”删除后的恢复的步骤:

(1)、sys用户登录


SQL>sqlplus / as sysdba
SQL> create pfile=’d:\pfile.bak’ from spfile --在d:\pfile.bak文件中最后加入一条:replication_dependency_tracking = FALSE
SQL> shutdown immediate --关闭数据库
SQL> startup pfile=’d:\pfile.bak’ --重新启动数据库


(2)、创建dual表


SQL> create table “sys”.”DUAL”
( “DUMMY” varchar2(1) )
pctfree 10 pctused 4;
SQL> insert into dual values(‘X’);
SQL> commit;


 (3)、授权


SQL>grant select on dual to public;


 

转自:https://www.cnblogs.com/qiangqiang/archive/2010/10/15/1852229.htmlhttps://www.cnblogs.com/deepbreath/p/5183853.html

 

posted on 2020-03-10 01:42  渴望飞翔的xian鱼  阅读(1348)  评论(0编辑  收藏  举报

导航