【oracle】揭开oracle神秘面纱之dual表

    在使用mybatis的时候,如果要往数据库中插入一条数据,你常会见到这么一条语句:SELECTxxxxxx.NEXTVAL AS IDFROM DUAL.你肯定会问,在库中,我没有建立DUAL这张表,这个表是怎么出来的,今天我就来说说DUAL.

    dual是一个虚拟表,用来构成select的语法规则,oracle保证dual里面永远只有一条记录。

.为什么要引入DUAL

基本上oracle引入dual为的就是符合语法;

    第一.我们先从名称来说,dual不是缩写词,本身就是完整的单词。dual名词意思是对数,做形容词时是指二重的,二元的。

    第二.Oracle中的dual表是一个单行单列的虚拟表。

    第三.Dual表是oracle与数据字典一起自动创建的一个表,这个表只有1列:DUMMY,数据类型为VERCHAR2(1)dual表中只有一个数据'X',Oracle有内部逻辑保证dual表中永远只有一条数据。

    第四.Dual表主要用来选择系统变量或求一个表达式的值。

    第五.我们见过:SELECTsysdate FROM daul 而Oracle的SELECT语法的限制为:

SELECT * |[column1 [AS alias1], column2 [AS alias2]] FROM table

 

    所以,没有表名就没有办法查询,而时间日期并不存放在任何表中,于是这个dual虚拟表的概念就被引入了。

 

.用途

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

(1)查看当前连接用户

SQL>select user from dual;

USER

------------------------------

SYSTEM

(2)查看当前日期、时间

SQL>select sysdate from dual;

SYSDATE

-----------

2007-1-24 1

SQL>select to_char(sysdate,''yyyy-mm-dd hh24:mi:ss'') from dual;

TO_CHAR(SYSDATE,''YYYY-MM-DDHH2

------------------------------

2007-01-2415:02:47

(3)当作计算器用

SQL>select 1+2 from dual;

1+2

----------

3

(4)查看序列值

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就是个一行一列的表,如果你往里执行insert、delete、truncate操作,就会导致很多程序出问题。

    DUAL是属于SYSschema的一个表,然后以PUBLIC SYNONYM的方式供其他数据库USER使用.

SQL>select owner, object_name , object_type from dba_objects where object_name like''%DUAL%'';

OWNEROBJECT_NAME OBJECT_TYPE

--------------------------- ------------------

SYS DUALTABLE

PUBLIC DUALSYNONYM

 

--查看表结构,只有一个字段DUMMY,为VARCHAR2(1)型

SQL> descdual

Name TypeNullable Default Comments

---------------- -------- ------- --------

DUMMYVARCHAR2(1) Y

 

--DUAL表的结构:

create tableSYS.DUAL

(

DUMMYVARCHAR2(1)

)

tablespaceSYSTEM

pctfree 10

pctused 40

initrans 1

maxtrans 255

storage

(

initial 16K

next 16K

minextents 1

maxextents505

pctincrease50

);

 

    从这样的表结构来看,DUAL表设计的目的就是要尽可能的简单,以减少检索的开销。

    还有,DUAL表是建立在SYSTEM表空间的,第一是因为DUAL表是SYS这个用户建的,本来默认的表空间就是SYSTEM;第二,把这个可能经常被查询的表和用户表分开来存放,对于系统性能的是有好处的。

    有了创建了表、创建了同义词还是不够的。DUAL在SYS这个Schema下面,因此用别的用户登录是无法查询这个表的,因此还需要授权:grant selecton SYS.DUAL to PUBLIC with grant option;将Select权限授予公众。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

弯_弯

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值