zoukankan      html  css  js  c++  java
  • oracle中的dual表简介

    一、dual表的作用

    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;
    #获得当前 locale
    select SYS_CONTEXT('USERENV','language') from dual;
    #获得一个随机数
    select dbms_random.random from dual;


    3、得到序列的下一个值或当前值,用下面语句


    #获得序列your_sequence的下一个值
    select your_sequence.nextval from dual;
    #获得序列your_sequence的当前值
    select your_sequence.currval from dual;


    4、可以用做计算器


    select 1+2 from dual;


    二、dual表的表结构解析

    dual表的结构:


    create table SYS.DUAL
    (
    DUMMY VARCHAR2(1)
    )
    tablespace SYSTEM
    pctfree 10
    pctused 40
    initrans 1
    maxtrans 255
    storage
    (
    initial 16K
    next 16K
    minextents 1
    maxextents 505
    pctincrease 50
    );


    1、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


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


    SQL> desc dual
    Name         Type                 Nullable Default Comments
    ---------------------------------------------------------------------------
    DUMMY     VARCHAR2(1)      Y


    3、dual在SYS这个Schema下面,因此用别的用户登录是无法查询这个表的,所以dual表必定经过以下授权。


    grant select on SYS.DUAL to PUBLIC with grant option;


    4、在创建数据库之后,DUAL表中便已经被插入了一条记录。个人认为:DUMMY字段的值并没有什么关系,重要的是DUAL表中的记录数。


    SQL> select count(*) from dual;
    COUNT(*)
    ----------
    1

    SQL> select * from dual;
    DUMMY
    -----
    X


    5、插入数据,再查询记录,只返回一行记录。


    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


    6、对于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


    三、dual表被删除后如何恢复

    dual表可以执行插入、更新、删除操作,还可以执行drop操作。但是不要去执行drop表的操作,否则会使系统不能用,数据库起不了,会报Database startup crashes with ORA-1092错误。dual表被“不幸”删除后的恢复的步骤:

    (1)、sys用户登录


    SQL>sqlplus / as sysdba
    SQL> create pfile=’d:pfile.bak’ from spfile --在d:pfile.bak文件中最后加入一条:replication_dependency_tracking = FALSE
    SQL> shutdown immediate --关闭数据库
    SQL> startup pfile=’d:pfile.bak’ --重新启动数据库


    (2)、创建dual表


    SQL> create table “sys”.”DUAL”
    ( “DUMMY” varchar2(1) )
    pctfree 10 pctused 4;
    SQL> insert into dual values(‘X’);
    SQL> commit;


     (3)、授权


    SQL>grant select on dual to public;


    转自:https://www.cnblogs.com/qiangqiang/archive/2010/10/15/1852229.htmlhttps://www.cnblogs.com/deepbreath/p/5183853.html

  • 相关阅读:
    IIS7中的几种身份鉴别方式(一)Basic身份验证
    IIS7中的几种身份鉴别方式(二)集成身份验证
    java集合
    SharePoint 2010中welcome page的设置细节
    SharePoint中使用Linq出现未将对象引用到实例化的解决方法
    SharePoint 2010中关于An error was encountered while retrieving the user profile的处理方式记录
    The Need for an Architectural Body of Knowledge
    The Softer Side of the Architect
    Event Receivers 学习小结
    使用SmtpClient发送带图片的邮件的代码实现
  • 原文地址:https://www.cnblogs.com/shujk/p/12453109.html
Copyright © 2011-2022 走看看