oralce中的dual详解 转 http://blog.sina.com.cn/s/blog_a5a24bcb0100zeay.html
dual是属于sys的
只有一个X varchar2(1)列
查询虚拟列不会产生逻辑IO
=======================================================================
DUAL表的用途
Dual 是 Oracle中的一个实际存在的表,任何用户均可读取,常用在没有目标表的Select语句块中
--查看当前连接用户
SQL> select user from dual;
USER
--------
SYSTEM
--查看当前日期、时间
sql> select sysdate from dual;
SYSDATE
---------
2012-5-22
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
=======================================================================
关于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)
)
PCTFREE 10
PCTUSED 40
INITRANS 1
MAXTRANS 255
NOCOMPRESS LOGGING
STORAGE(
INITIAL 16384
NEXT 1048576
MINEXTENTS 1
MAXEXTENTS 2147483645
PCTINCREASE 0
FREELISTS 1
FREELIST GROUPS 1
BUFFER_POOL DEFAULT)
TABLESPACE "SYSTEM"
DUAL表是建立在SYSTEM表空间的,第一是因为DUAL表是SYS这个用
户建的,本来默认的表空间就是SYSTEM;第二,把这个可能经常被查询的表
和用户表分开来存放,对于系统性能的是有好处的。
有了创建了表、创建了同义词还是不够的。DUAL在SYS这个Schema下面,
因此用别的用户登录是无法查询这个表的,因此还需要授权:
grant select on SYS.DUAL to PUBLIC with grant option;
将Select 权限授予公众。
事实上,DUAL表中的数据和ORACLE数据库环境有着十分重要的关系(ORACLE不会为此瘫痪,但是不少存储过程以
及一些查询将无法被正确执行)。
=======================================================================
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> insert into dual values(''Y'');
1 行 已插入
SQL> commit;
提交完成
SQL> select * from dual;
DUMMY
-----
X
Y
SQL> select sysdate from dual;
SYSDATE
-----------
2012-5-22
2012-5-22
这个时候返回的是两条记录,这样同样会引起问题。在通过使用
SQL>select sysdate into v_sysdate from dual;
来获取时间或者其他信息的存储过程来说 ,ORACLE 会抛出TOO_MANY_ROWS(ORA-01422)异常。
----------------------------------------------------------------------------
--把表截掉
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
-----------
我们便取不到系统日期了。因为,sysdate是个函数,作用于每一个数据行。现在没有数据了,自然就不可能取出系统日期。
这个对于很多用:
SQL>select sysdate into v_sysdate from dual;
这种方式取系统时间以及其他信息的存储过程来说是致命的,因为,
ORACLE会马上抛出一个NO_DATA_FOUND(ORA-01403)的异常,即使异常
被捕获,存储过程也将无法正确完成要求的动作。
----------------------------------------------------------------------------
对于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
=======================================================================
Drop Dual table
DUAL表可以执行插入、更新、删除操作,还可以执行drop操作。但是不要去执行drop表的操作,否则会使系统
不能用,数据库起不了,会报Databasestartup crashes with ORA-1092错误。
DUAL表被"不幸"删除后的恢复:
(1)用sys用户登陆。
SQL> create pfile=‘d:\pfile.bak‘ from spfile
SQL> shutdown immediate
(2)创建DUAL表。
CREATE TABLE "SYS"."DUAL"
(
"DUMMY" VARCHAR2(1)
)
PCTFREE 10
PCTUSED 40
INITRANS 1
MAXTRANS 255
NOCOMPRESS LOGGING
STORAGE(
INITIAL 16384
NEXT 1048576
MINEXTENTS 1
MAXEXTENTS 2147483645
PCTINCREASE 0
FREELISTS 1
FREELIST GROUPS 1
BUFFER_POOL DEFAULT)
TABLESPACE "SYSTEM" ;
(3)授予公众SELECT权限(SQL如下,但不要给UPDATE,INSERT,DELETE权限)
sql> grant select on dual to Public;
sql> select * from dual;
(4)向DUAL表插入一条记录(仅此一条): insert into dual values('X');
sql> insert into dual values(?X‘);
(5)提交修改。
sql> commit;
最后:
SQL> shutdown immediate
SQL> startup
--OK, 下面就可以正常使用了。
oralce中的dual详解 转 http://blog.sina.com.cn/s/blog_a5a24bcb0100zeay.html的更多相关文章
- oracle中imp命令详解 .
转自http://www.cnblogs.com/songdavid/articles/2435439.html oracle中imp命令详解 Oracle的导入实用程序(Import utility ...
- php中关于引用(&)详解
php中关于引用(&)详解 php的引用(就是在变量或者函数.对象等前面加上&符号) 在PHP 中引用的意思是:不同的变量名访问同一个变量内容. 与C语言中的指针是有差别的.C语言中的 ...
- JavaScript正则表达式详解(二)JavaScript中正则表达式函数详解
二.JavaScript中正则表达式函数详解(exec, test, match, replace, search, split) 1.使用正则表达式的方法去匹配查找字符串 1.1. exec方法详解 ...
- AngularJS select中ngOptions用法详解
AngularJS select中ngOptions用法详解 一.用法 ngOption针对不同类型的数据源有不同的用法,主要体现在数组和对象上. 数组: label for value in a ...
- 【转载】C/C++中extern关键字详解
1 基本解释:extern可以置于变量或者函数前,以标示变量或者函数的定义在别的文件中,提示编译器遇到此变量和函数时在其他模块中寻找其定义.此外extern也可用来进行链接指定. 也就是说extern ...
- Android中Service(服务)详解
http://blog.csdn.net/ryantang03/article/details/7770939 Android中Service(服务)详解 标签: serviceandroidappl ...
- python中threading模块详解(一)
python中threading模块详解(一) 来源 http://blog.chinaunix.net/uid-27571599-id-3484048.html threading提供了一个比thr ...
- Android中mesure过程详解
我们在编写layout的xml文件时会碰到layout_width和layout_height两个属性,对于这两个属性我们有三种选择:赋值成具体的数值,match_parent或者wrap_conte ...
- Android中Intent组件详解
Intent是不同组件之间相互通讯的纽带,封装了不同组件之间通讯的条件.Intent本身是定义为一个类别(Class),一个Intent对象表达一个目的(Goal)或期望(Expectation),叙 ...
随机推荐
- 【值转换器】 WPF中Image数据绑定Icon对象
原文:[值转换器] WPF中Image数据绑定Icon对象 这是原来的代码: <Image Source="{Binding MenuIcon}" ...
- C# 桌面软件开发-深入学习[2]- AY-C#人爱学不学-aaronyang技术分享
原文:C# 桌面软件开发-深入学习[2]- AY-C#人爱学不学-aaronyang技术分享 1 : C# Assembly.GetEntryAssembly().GetName().Version. ...
- PHP获得指定日期所在星期的第一天和最后一天
function getdays($day){ $lastday=date('Y-m-d',strtotime("$day Sunday")); $firstday=date('Y ...
- Windows 10开发基础——文件、文件夹和库(二)
主要内容: 使用选取器打开和保存文件 关于文件.文件夹和库,如果深究其实还是有比较多的内容,我们这一次来学习一下选取器就收了.还有上篇博文中读写文本文件的三种方式可以细细体会一下. 文件选取器包含文件 ...
- Win10《芒果TV》送7天免费会员,邀您抢先看萌心自制《妈妈是超人3》
<妈妈是超人>第三季萌心归来,霍思燕,贾静雯,黄圣依,邓莎联合释放"妈妈的声音",嗯哼,咘咘,波妞,安迪,大麟子五位萌娃共同出镜,萌化屏幕.Win10<芒果TV& ...
- 【转】编程之道 之 Rob Pike
1.你无法断定程序会在什么地方耗费运行时间.瓶颈经常出现在想不到的地方,所以别急于胡乱找个地方改代码,除非你已经证实那儿就是瓶颈所在. 2.估量.在你没对代码进行估量,特别是没找到最耗时的那部分之前, ...
- 二叉树基本操作C代码
#include<stdio.h> #include<malloc.h> #define LEN sizeof(struct ChainTree) struct ChainTr ...
- 把#define宏转换成指定格式
之前在弄一个东西的,有一大堆的宏,需要把它转换成其它的形式.遇到这种大批量的东西,我特别没有耐心去一个一个的弄,于是写了一段代码. 估计大家平常比较难用得上,不过可以平常相似的情况用来参考. Sort ...
- 如何替换Windows的Shell(即explorer.exe)
原文:如何替换Windows的Shell(即explorer.exe) 下载一个可以查看用户的SID的软件,如SysInternals套装中的PsGetsid.exe(地址:http://www.it ...
- QT5 屏幕旋转90度
主要思路是将所有项目界面加载到QGraphicsScene,再进行旋转操作.直接上代码#include <QApplication>#include <QGraphicsView&g ...