oracle dual表

来源:互联网 发布:淘宝旧版本6.11.3 编辑:程序博客网 时间:2024/05/21 17:25

1DUAL表的用途
Dual
Oracle中的一个实际存在的表,任何用均可取,常用在没有目表的Select

--
看当前接用
Connected to Oracle Database 10g Enterprise Edition Release 10.1.0.2.0
Connected as SYS

SQL> select user from dual;
USER
------------------------------
SYSTEM

--
看当前日期、时间
SQL> select systimestamp from dual;
SYSTIMESTAMP
--------------------------------------------------------------------------------
09-3
-1111.11.05.901000上午+08:00

SQL> select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss') from dual;
TO_CHAR(SYSDATE,'YYYY-MM-DDHH2
------------------------------
2011-03-09 11:12:03

--
当作算器用
SQL> select 1+2 from dual;
       1+2
----------
         3
--
看序列
SQL> create sequence a increment by 1 start with 1;
Sequence created

SQL> select a.nextval from dual;
   NEXTVAL
----------
         1
SQL> select a.currval from dual;
   CURRVAL
----------
         1
SQL> drop sequence a;
Sequence dropped

2
DUAL表的测试与分析
DUAL
就是个一行一列的表,如果你往里insertdeletetruncate操作,就会致很多程序出问题果也因sql*pluspl/sql dev等工具而异。
--
DUAL是什OBJECT

--DUAL
是属于SYSschema的一个表,然后以PUBLIC SYNONYM的方式供其他数据USER使用.
先格式化列标题和列数据的现实格式:
SQL> clear columns;
SQL> COLUMN owner HEADING FORMAT a10 WORD_WRAPPEND
SQL> COLUMN object_name HEADING FORMAT a15 WORD_WRAPPEND
SQL> COLUMN object_type HEADING FORMAT a15 WORD_WRAPPEND
SQL> select owner,object_name,object_type from dba_objects where object_namelike '%DUAL%';

OWNER      OBJECT_NAME    OBJECT_TYPE
---------- --------------- ---------------
SYS       DUAL            TABLE
PUBLIC    DUAL            SYNONYM

SQL> clear columns;

--
构,只有一个字段DUMMYVARCHAR2(1)
SQL> desc dual;
Name  Type        Nullable DefaultComments
----- ----------- -------- ------- --------
DUMMY VARCHAR2(1) Y

--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
  );

/*
很是困惑,ORACLE要用VARCHAR2(1)型,用CHAR(1)道不好?从这样的表构来看,DUAL设计的目的就是要尽可能的简单,以减少索的开销
有,DUAL表是建立在SYSTEM表空的,第一是因DUAL表是SYS个用建的,本来默的表空就是SYSTEM;第二,把个可能常被查询的表和用表分来存放,于系性能的是有

的。
有了建了表、建了同义词还是不的。DUALSYSSchema下面,因此用的用是无法查询这个表的,因此需要授
grant select on SYS.DUAL to PUBLIC with grant option;
Select限授予公众。
接下来看看DUAL表中的数据,事上,DUAL表中的数据和ORACLE数据库环境有着十分重要的系(ORACLE不会瘫痪,但是不少存储过程以及一些查询将无法被正确行)。
*/

--
查询行数
--
建数据之后,DUAL表中便已被插入了一条记录。个人认为DUMMY字段的并没有什么关系,重要的是DUAL表中的记录
SQL> select count(*) from dual;
  COUNT(*)
----------
         1

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

--
使用PL/SQL Developer插入数据,能现实所有的数据。
SQL> insert into dual values('Y');
1 row inserted

SQL> insert into dual values('X');
1 row inserted

SQL> insert into dual values('Z');
1 row inserted

SQL> commit;
Commit complete

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

但是当我们执行下面示一行:
SQL> select sysdate from dual;
SYSDATE
-----------
2011-3-9 12

SQL> select systimestamp from dual;
SYSTIMESTAMP
--------------------------------------------------------------------------------
09-3
-1112.10.23.073000下午+08:00

systemoracleSQL*Plus后,行相同的操作,示插入数据成功,但是查询不了添加的数据,统计也只有一条数据,看表中的所有数据,也只能看到原表中的数据'X'.

--
把表截掉
SQL> truncate table dual;
Table truncated

SQL> commit;
Commit complete

然而,数据表里有一条数据没有被除,是表里至少要有一条数据的原因。
SQL> select count(*) from dual;
  COUNT(*)
----------
         1

SQL> select * from dual;
no rows selected

但是下面能成功:
SQL> select sysdate from dual;
SYSDATE
-----------
2011-3-9 12

--
着把DUAL表中的数据除,看看会出么结果:
SQL> delete from dual;
1 row deleted

SQL> select * from dual;
no rows selected

SQL> select sysdate from dual;
SYSDATE
-----------
09-3
-11

能取到系日期。在以前的版本中是取不到系日期的,据原因是:sysdate是个函数,作用于一个数据行。在没有数据了,自然就不可能取出系日期。但是10g版本中此做了

修改,如果你表中的数据行全部除,oracle也会保留一条空数据在表中的,这样便于你用dual行其他操作。

--
DELETE操作来ORACLEDUAL表的操作做了一些内部,尽量保DUAL表中只返回一条记录.当然写内部操作是不可
--
不管表内有多少记录没有记录除外),ORACLEDELETE操作都只除了一条数据。
SQL> select count(*) from dual;
COUNT(*)
----------
4

SQL> delete from dual;
4 rows deleted

SQL> commit;
Commit complete

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

:ORACLEDUAL表不同常特性的解
There is internalized code that makes this happen. Code checks that ensurethata table scan of SYS.DUAL only returns one row. Svrmgrl behaviour is incorrectbut this

is now an obsolete product.
The base issue you should always remember and keep is: DUAL table should alwayshave 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 gettingresults 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 1row 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如上述,但不要UPDATEINSERTDELETE限)。
DUAL表插入一条记录此一条): insert into dual values('X');
提交修改。
--
sys
SQL> create pfile=’d:/pfile.bak’ from spfile
SQL> 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
-
X
 
SQL> shutdown immediate
数据经关闭
数据
ORACLE
例程已经关闭
SQL> startup
ORACLE
例程已
 
Total System Global Area 135338868 bytes
FixedSize                  453492 bytes
VariableSize            109051904 bytes
Database Buffers          25165824 bytes
Redo Buffers                667648 bytes
数据
数据

原创粉丝点击