知识大全 详解Oracle数据库中DUAL表的使用

Posted 操作

篇首语:只给君子看门,不给小人当家。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 详解Oracle数据库中DUAL表的使用相关的知识,希望对你有一定的参考价值。

详解Oracle数据库中DUAL表的使用  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!

   DUAL表的用途

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

  

  

   查看当前连接用户SQL> select user from dual;USER SYSTEM 查看当前日期 时间SQL> select sysdate from dual;SYSDATE SQL> select to_char(sysdate yyyy mm dd hh :mi:ss ) from dual;TO_CHAR(SYSDATE YYYY MM DDHH : : 当作计算器用SQL> select + from dual; + 查看序列值SQL> create sequence aaa increment by start with ;SQL> select aaa nextval from dual;NEXTVAL SQL> select aaa currval from dual;CURRVAL

   关于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              TABLEPUBLIC     DUAL              SYNONYM 查看表结构 只有一个字段DUMMY 为VARCHAR ( )型SQL> desc dualName Type        Nullable Default Comments DUMMY VARCHAR ( ) Y DUAL表的结构 create table SYS DUAL(DUMMY VARCHAR ( ))tablespace SYSTEMpctfree pctused initrans maxtrans storage(initial Knext Kminextents maxextents pctincrease );/*

  很是困惑 ORACLE为什么要用VARCHAR( )型 用CHAR( )难道不好么?从这样的表结构来看 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(*) SQL> select * from dual;DUMMY X 插入数据 再查询记录 只返回一行记录SQL> insert into dual values ( Y ); row created SQL> mit;Commit plete SQL> insert into dual values ( X ); row created SQL> insert into dual values ( Z ); row created SQL> mit;Commit plete SQL> select count(*) from dual;COUNT(*) SQL> select * from dual;DUMMY X/* 假我们插入一条数据 DUAL表不是返回一行 而是多行记录 那会是什么结果呢?SQL> insert into dual values( Y ); 行 已插入SQL> mit;提交完成SQL> select * from dual;DUMMY XYSQL> select sysdate from dual;SYSDATE

  这个时候返回的是两条记录 这样同样会引起问题 在通过使用

  

  select sysdate into v_sysdate from dual;

  来获取时间或者其他信息的存储过程来说 ORACLE会抛出TOO_MANY_ROWS(ORA )异常 因此 需要保证在DUAL表内有且仅有一条记录 当然 也不能把DUAL表的UPDATE INSERT DELETE权限随意释放出去 这样对于系统是很危险的

  

  

  */ 把表截掉SQL> truncate table dual;Table truncated SQL> select count(*) from dual;COUNT(*) SQL> select * from dual;no rows selectedSQL> select sysdate from dual;no rows selected 试着把DUAL表中的数据删除 看看会出现什么结果 SQL> delete from dual; 行 已删除SQL> select * from dual;DUMMY SQL> select sysdate from dual;SYSDATE /*

  我们便取不到系统日期了 因为 sysdate是个函数 作用于每一个数据行 现在没有数据了 自然就不可能取出系统日期 这个对于很多用

  

  select sysdate into v_sysdate from dual;

  这种方式取系统时间以及其他信息的存储过程来说是致命的 因为 Oracle会马上抛出一个NO_DATA_FOUND(ORA )的异常 即使异常被捕获 存储过程也将无法正确完成要求的动作

  

  

  */ 对于DELETE操作来说 ORACLE对DUAL表的操作做了一些内部处理 尽量保证DUAL表中只返回一条记录 当然这写内部操作是不可见的 不管表内有多少记录(没有记录除外) ORACLE对于每次DELETE操作都只删除了一条数据 SQL> select count(*) from dual;COUNT(*) SQL> delete from dual; 行 已删除SQL> mit;提交完成SQL> select count(*) from dual;COUNT(*) /*附: 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 ROW Dual is a normal table with one dummy column of varchar ( ) This is basically used from several applications as a pseudo table for getting results from a select statement that use functions like sysdate or otherprebuilt 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 row then applications (that use DUAL) may fail with TOO_MANY_ROWS exception So DUAL should ALWAYS have and only row*/

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

   如果DUAL表被 不幸 删除后的恢复 用sys用户登陆 创建DUAL表 授予公众SELECT权限(SQL如上述 但不要给UPDATE INSERT DELETE权限)

  向DUAL表插入一条记录(仅此一条) insert into dual values( X );提交修改

  

   用sys用户登陆 SQL> create pfile= d:\\pfile bak from spfileSQL> shutdown immediate 在d:\\pfile bak文件中最后加入一条 replication_dependency_tracking = FALSE 重新启动数据库 SQL> startup pfile= d:\\pfile bak SQL> create table sys DUAL ( DUMMY varchar ( ) )pctfree pctused ;SQL> insert into dual values( X );SQL> mit;SQL> Grant select on dual to Public;

  授权成功

  

  

相关参考

知识大全 Oracle数据库中的索引详解

Oracle数据库中的索引详解  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  一ROWID的概念

知识大全 关于Oracle的Dual表

关于Oracle的Dual表  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  有朋友问到关于Ora

知识大全 更改Oracle数据库表的表空间

更改Oracle数据库表的表空间  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  在Oracle数

知识大全 Oracle实例和Oracle数据库详解

Oracle实例和Oracle数据库详解  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  一ORA

知识大全 Oracle两张表的数据比较

Oracle两张表的数据比较  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  在某些情况下我们会需

知识大全 浅谈Oracle中大数据量表的管理

浅谈Oracle中大数据量表的管理  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  简介  随着信

知识大全 Oracle数据库数据操作和控制语言详解

Oracle数据库数据操作和控制语言详解  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  SQL语

知识大全 Oracle11g物理备用数据库“实况克隆”详解

Oracle11g物理备用数据库“实况克隆”详解  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  

知识大全 Linux操作系统下的Oracle数据库编程详解

Linux操作系统下的Oracle数据库编程详解  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  

知识大全 使用Oracle数据挖掘API方法详解

使用Oracle数据挖掘API方法详解  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  Oracl