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的更多相关文章

  1. oracle中imp命令详解 .

    转自http://www.cnblogs.com/songdavid/articles/2435439.html oracle中imp命令详解 Oracle的导入实用程序(Import utility ...

  2. php中关于引用(&)详解

    php中关于引用(&)详解 php的引用(就是在变量或者函数.对象等前面加上&符号) 在PHP 中引用的意思是:不同的变量名访问同一个变量内容. 与C语言中的指针是有差别的.C语言中的 ...

  3. JavaScript正则表达式详解(二)JavaScript中正则表达式函数详解

    二.JavaScript中正则表达式函数详解(exec, test, match, replace, search, split) 1.使用正则表达式的方法去匹配查找字符串 1.1. exec方法详解 ...

  4. AngularJS select中ngOptions用法详解

    AngularJS select中ngOptions用法详解   一.用法 ngOption针对不同类型的数据源有不同的用法,主要体现在数组和对象上. 数组: label for value in a ...

  5. 【转载】C/C++中extern关键字详解

    1 基本解释:extern可以置于变量或者函数前,以标示变量或者函数的定义在别的文件中,提示编译器遇到此变量和函数时在其他模块中寻找其定义.此外extern也可用来进行链接指定. 也就是说extern ...

  6. Android中Service(服务)详解

    http://blog.csdn.net/ryantang03/article/details/7770939 Android中Service(服务)详解 标签: serviceandroidappl ...

  7. python中threading模块详解(一)

    python中threading模块详解(一) 来源 http://blog.chinaunix.net/uid-27571599-id-3484048.html threading提供了一个比thr ...

  8. Android中mesure过程详解

    我们在编写layout的xml文件时会碰到layout_width和layout_height两个属性,对于这两个属性我们有三种选择:赋值成具体的数值,match_parent或者wrap_conte ...

  9. Android中Intent组件详解

    Intent是不同组件之间相互通讯的纽带,封装了不同组件之间通讯的条件.Intent本身是定义为一个类别(Class),一个Intent对象表达一个目的(Goal)或期望(Expectation),叙 ...

随机推荐

  1. python 教程 第十八章、 Web编程

    第十八章. Web编程 import urllib2 LOGIN = 'jin' PASSWD = 'Welcome' URL = 'https://tlv-tools-qc:8443/qcbin/s ...

  2. WPF 实现水纹效果

    原文:WPF 实现水纹效果 鼠标滑过产生水纹,效果图如下:     XMAL就放置了一个img标签   后台主要代码 窗体加载: private void Window_Loaded(object s ...

  3. git 命令修改commit时的用户名和邮箱地址

    1.介绍 在git的用户名和邮箱是有一个仓库和全局之分的,在利用vs插件是也有显示:

  4. PostSharp-5.0.26安装包_KeyGen发布_支持VS2017

    PostSharp-5.0.26安装包_KeyGen发布_支持VS2017 请低调使用. PostSharp安装及注册步骤截图.rar 请把浏览器主页设置为以下地址支持本人.https://www.d ...

  5. jquery hover()的使用

    <!DOCTYPE html><html><head><meta http-equiv="Content-Type" content=&q ...

  6. 那些证书相关的玩意儿(SSL,X.509,PEM,DER,CRT,CER,KEY,CSR,P12等)(使用OpenSSL的命令行)

    之前没接触过证书加密的话,对证书相关的这些概念真是感觉挺棘手的,因为一下子来了一大堆新名词,看起来像是另一个领域的东西,而不是我们所熟悉的编程领域的那些东西,起码我个人感觉如此,且很长时间都没怎么搞懂 ...

  7. 细谈unity资源管理的设计

    一.概要 本文主要说说Unity是如何管理的,基于何种方式,基于这种管理方式,又该如何规划资源管理,以及构建bundle,是后面需要详细讨论的. 二.Unity的资源管理方式 2.1 资源分类 uni ...

  8. 图像滤镜艺术---Hudson滤镜(Instagram)

    原文:图像滤镜艺术---Hudson滤镜(Instagram)     今天给大家实现的是Instagram中的Hudson滤镜,为什么介绍Instagram滤镜,原因很简单,Instagram本身就 ...

  9. Android零基础入门第54节:视图切换组件ViewSwitcher

    原文:Android零基础入门第54节:视图切换组件ViewSwitcher 前面三期学习了ProgressBar系列组件,那本期开始一起来学习ViewAnimator组件. 一.ViewAnimat ...

  10. java模拟post请求发送json数据

    import com.alibaba.fastjson.JSONObject; import org.apache.http.client.methods.CloseableHttpResponse; ...