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

  • 相关阅读:
    CSS属性中Display与Visibility的不同
    11
    【零基础学习iOS开发】【01-前言】01-开篇
    C#计算时间差。
    C++拷贝构造函数:浅拷贝与深拷贝
    C++:string操作函数
    文件输入输出(二):文件的操作
    文件输入输出(一):重定向
    Java中的StringBuffer
    C++中setiosflags()的用法
  • 原文地址:https://www.cnblogs.com/shujk/p/12453109.html
Copyright © 2011-2022 走看看