1、DUAL表的用途
Dual 是 Oracle中的一个实际存在的表,任何用户均可读取,常用在没有目标表的Select语句块中
--查看当前连接用户SQL select user from dual;USER------------------------------SYSTEM--查看当前日期、时间SQL select sysdate from dual;SYSDATE-----------2007-1-24 1SQL select to_char异常。因此,需要保证在DUAL表内有且仅有一条记录。当然,也不能把DUAL表的UPDATE,INSERT,DELETE权限随意释放出去,这样对于系统是很危险的*/--把表截掉SQL truncate table dual;Table truncated.SQL select count(*) from dual;COUNT(*)----------0SQL select * from dual;no rows selectedSQL 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是个函数,作用于每一个数据行。现在没有数据了,自然就不可能取出系统日期。这个对于很多用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(*)----------2SQL delete from dual;1 行 已删除SQL commit;提交完成SQL select count(*) from dual;COUNT(*)----------1/*附: 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 1 ROW. Dual is a normal table with one dummy column of varchar2(1).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 1 row then applications (that use DUAL) may fail with TOO_MANY_ROWS exception.So DUAL should ALWAYS have 1 and only 1 row*/ 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 spfileSQL 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-XSQL shutdown immediate数据库已经关闭。已经卸载数据库。ORACLE 1、DUAL表的用途
Dual 是 Oracle中的一个实际存在的表,任何用户均可读取,常用在没有目标表的Select语句块中
--查看当前连接用户SQL select user from dual;USER------------------------------SYSTEM--查看当前日期、时间SQL select sysdate from dual;SYSDATE-----------2007-1-24 1SQL select to_char异常。因此,需要保证在DUAL表内有且仅有一条记录。当然,也不能把DUAL表的UPDATE,INSERT,DELETE权限随意释放出去,这样对于系统是很危险的*/--把表截掉SQL truncate table dual;Table truncated.SQL select count(*) from dual;COUNT(*)----------0SQL select * from dual;no rows selectedSQL 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是个函数,作用于每一个数据行。现在没有数据了,自然就不可能取出系统日期。这个对于很多用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(*)----------2SQL delete from dual;1 行 已删除SQL commit;提交完成SQL select count(*) from dual;COUNT(*)----------1/*附: 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 1 ROW. Dual is a normal table with one dummy column of varchar2(1).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 1 row then applications (that use DUAL) may fail with TOO_MANY_ROWS exception.So DUAL should ALWAYS have 1 and only 1 row*/ 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 spfileSQL 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-XSQL shutdown immediate数据库已经关闭。已经卸载数据库。ORACLE
| 广告合作:400-664-0084 全国热线:400-664-0084 Copyright 2010 - 2017 www.my8848.com 珠峰网 粤ICP备15066211号 珠峰网 版权所有 All Rights Reserved
|