oracle数据库自带dual浅解
来源:互联网 发布:C语言迭代法求立方根 编辑:程序博客网 时间:2024/06/06 03:14
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;--获得主机名
select SYS_CONTEXT('USERENV','language') from dual;--获得当前locale
select dbms_random.random from dual;--获得一个随机数
3、得到序列的下一个值或当前值,用下面语句
select your_sequence.nextval from dual;--获得序列your_sequence的下一个值
select your_sequence.currval from dual;--获得序列your_sequence的当前值
4、可以用做计算器
select 7*9 from dual;
------
Oracle系统中dual表是一个“神秘”的表,网上有很多网友都对该表进行了测试,该表只有一行一列,其实该表和系统中的其他表一样,一样可以执行插入、更新、删除操作,还可以执行drop操作。但是不要去执行drop表的操作,否则会使系统不能用,数据库起不了,会报Database startup crashes with ORA-1092错误。
此时也不要慌乱,可以通过执行以下步骤来进行恢复。可以用sys用户登陆。
在d:pfile.bak文件中最后加入一条:
重新启动数据库:
[an error occurred while processing this directive]
DUAL ? 有什么神秘的? 当你想得到ORACLE系统时间, 简简单单敲一行SQL 不就得了吗? 故弄玄虚…. SQL> select sysdate from dual; SYSDATE ---------
28-SEP-03 哈哈, 确实DUAL的使用很方便. 但是大家知道DUAL倒底是什么OBJECT, 它有什么特殊的行为吗? 来,我们一起看一看. 首先搞清楚DUAL是什么OBJECT :
SQL> connect system/manager Connected. 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
原来DUAL是属于SYS schema的一个表,然后以PUBLIC SYNONYM的方式供其他数据库USER使用. 再看看它的结构: SQL> desc dual Name Null? Type
----------------------------------------- -------- ---------------------------- DUMMY VARCHAR2(1)
SQL> 只有一个名字叫DUMMY的字符型COLUMN . 然后查询一下表里的数据: SQL> select dummy from dual; DUMMY ---------- X 哦, 只有一条记录,
DUMMY的值是’X’ .很正常啊,没什么奇怪嘛. 好,下面就有奇妙的东西出现了! 插入一条记录: SQL> connect sys as sysdba Connected.
SQL> insert into dual values ( 'Y'); 1 row created. bitsCN.nET*中国网管博客SQL> commit; Commit complete.
SQL> select count(*) from dual; COUNT(*) ---------- 2 迄今为止,一切正常. 然而当我们再次查询记录时,奇怪的事情发生了
SQL> select * from dual; DUMMY ---------- X 刚才插入的那条记录并没有显示出来 ! 明明DUAL表中有两条记录, 可就是只显示一条!
再试一下删除 ,狠一点,全删光 ! SQL> delete from dual; /*注意没有限定条件,试图删除全部记录*/ 1 row deleted.
SQL> commit; Commit complete. 哈哈,也只有一条记录被删掉, SQL> select * from dual; [bitsCN.Com]DUMMY ---------- Y
为什么会这样呢? 难道SQL的语法对DUAL不起作用吗?带着这个疑问, 我查询了一些ORACLE官方的资料. 原来ORACLE对DUAL表的操作做了一些内部处理,
尽量保证DUAL表中只返回一条记录.当然这写内部操作是不可见的 . 看来ORACLE真是蕴藏着无穷的奥妙啊! 附: ORACLE关于DUAL表不同寻常特性的解释
There is internalized code that makes this happen. Code checks that ensure that 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 other prebuilt 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.
创建序列
CREATE SEQUENCE emp_sequence --序列名
INCREMENT BY 1 -- 每次加几个
START WITH 1 -- 从1开始计数
NOMAXVALUE -- 不设置最大值
NOCYCLE -- 一直累加,不循环
CACHE 10;
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;--获得主机名
select SYS_CONTEXT('USERENV','language') from dual;--获得当前locale
select dbms_random.random from dual;--获得一个随机数
3、得到序列的下一个值或当前值,用下面语句
select your_sequence.nextval from dual;--获得序列your_sequence的下一个值
select your_sequence.currval from dual;--获得序列your_sequence的当前值
4、可以用做计算器
select 7*9 from dual;
------
Oracle系统中dual表是一个“神秘”的表,网上有很多网友都对该表进行了测试,该表只有一行一列,其实该表和系统中的其他表一样,一样可以执行插入、更新、删除操作,还可以执行drop操作。但是不要去执行drop表的操作,否则会使系统不能用,数据库起不了,会报Database startup crashes with ORA-1092错误。
此时也不要慌乱,可以通过执行以下步骤来进行恢复。可以用sys用户登陆。
在d:pfile.bak文件中最后加入一条:
重新启动数据库:
[an error occurred while processing this directive]
DUAL ? 有什么神秘的? 当你想得到ORACLE系统时间, 简简单单敲一行SQL 不就得了吗? 故弄玄虚…. SQL> select sysdate from dual; SYSDATE ---------
28-SEP-03 哈哈, 确实DUAL的使用很方便. 但是大家知道DUAL倒底是什么OBJECT, 它有什么特殊的行为吗? 来,我们一起看一看. 首先搞清楚DUAL是什么OBJECT :
SQL> connect system/manager Connected. 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
原来DUAL是属于SYS schema的一个表,然后以PUBLIC SYNONYM的方式供其他数据库USER使用. 再看看它的结构: SQL> desc dual Name Null? Type
----------------------------------------- -------- ---------------------------- DUMMY VARCHAR2(1)
SQL> 只有一个名字叫DUMMY的字符型COLUMN . 然后查询一下表里的数据: SQL> select dummy from dual; DUMMY ---------- X 哦, 只有一条记录,
DUMMY的值是’X’ .很正常啊,没什么奇怪嘛. 好,下面就有奇妙的东西出现了! 插入一条记录: SQL> connect sys as sysdba Connected.
SQL> insert into dual values ( 'Y'); 1 row created. bitsCN.nET*中国网管博客SQL> commit; Commit complete.
SQL> select count(*) from dual; COUNT(*) ---------- 2 迄今为止,一切正常. 然而当我们再次查询记录时,奇怪的事情发生了
SQL> select * from dual; DUMMY ---------- X 刚才插入的那条记录并没有显示出来 ! 明明DUAL表中有两条记录, 可就是只显示一条!
再试一下删除 ,狠一点,全删光 ! SQL> delete from dual; /*注意没有限定条件,试图删除全部记录*/ 1 row deleted.
SQL> commit; Commit complete. 哈哈,也只有一条记录被删掉, SQL> select * from dual; [bitsCN.Com]DUMMY ---------- Y
为什么会这样呢? 难道SQL的语法对DUAL不起作用吗?带着这个疑问, 我查询了一些ORACLE官方的资料. 原来ORACLE对DUAL表的操作做了一些内部处理,
尽量保证DUAL表中只返回一条记录.当然这写内部操作是不可见的 . 看来ORACLE真是蕴藏着无穷的奥妙啊! 附: ORACLE关于DUAL表不同寻常特性的解释
There is internalized code that makes this happen. Code checks that ensure that 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 other prebuilt 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.
创建序列
CREATE SEQUENCE emp_sequence --序列名
INCREMENT BY 1 -- 每次加几个
START WITH 1 -- 从1开始计数
NOMAXVALUE -- 不设置最大值
NOCYCLE -- 一直累加,不循环
CACHE 10;
0 0
- oracle数据库自带dual浅解
- oracle数据库自带函数
- oracle数据库自带功能
- oracle数据库自带函数
- oracle数据库dual使用
- 操作oracle自带scott数据库
- Oracle自带数据库用户作用
- oracle数据库中的sys.dual
- Oracle数据库只Dual表
- 使用oracle自带的DATABASE ADMINISTRATION 恢复整个数据库
- 如何使用ORACLE自带的HR实例数据库?
- oracle自带数据库相关sql语句练习
- oracle数据库里dual表是什么表?
- 【原】关于Oracle数据库中的Dual表
- Oracle数据库 dual表的用途
- ORACLE数据库中dual虚拟表简介
- oracle数据库里dual表是什么表? .
- wince 自带数据库
- 练习——LinkedList
- 自学-DelegatingFilterProxy-04
- 关于java播放wav格式音乐问题及代码解释
- 访问不了Linux的操作环境下的Dubbo服务解决办法
- 二叉树的建立,遍历和深度检测
- oracle数据库自带dual浅解
- 基于quartz的调度系统实现
- failed to read artifact descriptor for xx
- java开发微信公众平台-- 服务器配置
- 4-1 Strongly Connected Components (17分)
- Java从数据库中读取Blob对象图片并显示
- 活动被回收时的处理
- 音乐格式问题
- 过滤器(Filter)应用:全站压缩----Gzip网页压缩输出