1.我们先从名称来说,dual不是缩写词,本身就是完整的单词。dual名词意思是对数,做形容词时是指二重的,二元的。
2.Oracle中的dual表是一个单行单列的虚拟表。
3.Dual表是oracle与数据字典一起自动创建的一个表,这个表只有1列:DUMMY,数据类型为VERCHAR2(1),dual表中只有一个数据'X',
Oracle有内部逻辑保证dual表中永远只有一条数据。4.Dual表主要用来选择系统变量或求一个表达式的值。
5.更具体的说,我们见过这样一个简单的例子:
<wbr style="color:rgb(50,62,50); font-family:simsun; line-height:21px"><span style="color:rgb(50,62,50); font-family:simsun; line-height:21px"></span><wbr style="color:rgb(50,62,50); font-family:simsun; line-height:21px"><span style="color:rgb(50,62,50); font-family:simsun; line-height:21px"></span><wbr style="color:rgb(50,62,50); font-family:simsun; line-height:21px"><span style="color:rgb(50,62,50); font-family:simsun; line-height:21px"></span><wbr style="color:rgb(50,62,50); font-family:simsun; line-height:21px"><span style="color:rgb(50,62,50); font-family:simsun; line-height:21px"></span><wbr style="color:rgb(50,62,50); font-family:simsun; line-height:21px"><span style="color:rgb(50,62,50); font-family:simsun; line-height:21px">SELECT
sysdate FROM daul</span><br style="color:rgb(50,62,50); font-family:simsun; line-height:21px"><span style="color:rgb(50,62,50); font-family:simsun; line-height:21px"></span><wbr style="color:rgb(50,62,50); font-family:simsun; line-height:21px"><span style="color:rgb(50,62,50); font-family:simsun; line-height:21px"></span><wbr style="color:rgb(50,62,50); font-family:simsun; line-height:21px"><span style="color:rgb(50,62,50); font-family:simsun; line-height:21px"></span><wbr style="color:rgb(50,62,50); font-family:simsun; line-height:21px"><span style="color:rgb(50,62,50); font-family:simsun; line-height:21px">而Oracle的SELECT语法的限制为:</span><br style="color:rgb(50,62,50); font-family:simsun; line-height:21px"><span style="color:rgb(50,62,50); font-family:simsun; line-height:21px">SELECT * | [column1 [AS alias1], column2 [AS alias2]] FROM table</span><br style="color:rgb(50,62,50); font-family:simsun; line-height:21px"><br style="color:rgb(50,62,50); font-family:simsun; line-height:21px"><span style="color:rgb(50,62,50); font-family:simsun; line-height:21px">所以,没有表名就没有办法查询,而时间日期并不存放在任何表中,于是这个dual虚拟表的概念就被引入了。</span><br style="color:rgb(50,62,50); font-family:simsun; line-height:21px"><br style="color:rgb(50,62,50); font-family:simsun; line-height:21px"></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>
1、DUAL表的用途
Dual 是 Oracle中的一个实际存在的表,任何用户均可读取,常用在没有目标表的Select语句块中
--查看当前连接用户
SQL> select user from dual;
USER
------------------------------
SYSTEM
--查看当前日期、时间
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-24 15:02:47
--当作计算器用
SQL> select 1+2 from dual;
1+2
----------
3
--查看序列值
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
2、关于DUAL表的测试与分析
DUAL就是个一行一列的表,如果你往里执行insert、delete、truncate操作,就会导致很多程序出问题。结果也因sql*plus、pl/sql dev等工具而异。
--查看DUAL是什么OBJECT
--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
--查看表结构,只有一个字段DUMMY,为VARCHAR2(1)型
SQL> desc dual
Name Type Nullable Default Comments
----- ----------- -------- ------- --------
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
);
--查询行数
--在创建数据库之后,DUAL表中便已经被插入了一条记录。个人认为:DUMMY字段的值并没有什么关系,重要的是DUAL表中的记录数
SQL> select count(*) from dual;
COUNT(*)
----------
1
SQL> select * from dual;
DUMMY
-----
X
--插入数据,再查询记录,只返回一行记录
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
--把表截掉
SQL> truncate table dual;
Table truncated.
SQL> select count(*) from dual;
COUNT(*)
----------
0
SQL> select * from dual;
no rows selected
SQL> select sysdate from dual;
no rows selected
--试着把DUAL表中的数据删除,看看会出现什么结果:
SQL> delete from dual;
1 行 已删除
SQL> select * from dual;
DUMMY
-----
SQL> select sysdate from dual;
SYSDATE
-----------
--对于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表可以执行插入、更新、删除操作,还可以执行drop操作。但是不要去执行drop表的操作,否则会使系统不能用,数据库起不了,会报Database startup crashes with ORA-1092错误。
3、如果DUAL表被“不幸”删除后的恢复:
用sys用户登陆。
创建DUAL表。
授予公众SELECT权限(SQL如上述,但不要给UPDATE,INSERT,DELETE权限)。
向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
Fixed Size 453492 bytes
Variable Size 109051904 bytes
Database Buffers 25165824 bytes
Redo Buffers 667648 bytes
数据库装载完毕。
数据库已经打开。
SQL>
--OK, 下面就可以正常使用了。
分享到:
相关推荐
Oracle 数据库中 DUAL 表的使用 DUAL 表是 Oracle 数据库中一个特殊的表,它是任何用户都可以读取的公共表。DUAL 表的用途非常广泛,常用在没有目标表的 Select 语句块中。下面都是 DUAL 表的一些常见使用场景: ...
在Oracle数据库中,`DUAL`是一个特殊的表,主要用于测试和获取系统信息,如当前日期和时间。它由Oracle系统拥有的`SYS`模式下的一个表,同时通过`PUBLIC SYNONYM`为所有数据库用户提供了公共访问权限。让我们深入...
### Oracle Dual 表详解 #### 一、Oracle Dual 表简介 在Oracle数据库中,`DUAL`表是一个特殊的表,通常用于查询那些不需要从实际数据表中获取的信息,例如系统时间、版本号等。虽然它看起来像是一个普通表,但其...
### Oracle Dual 表详解 #### 一、Oracle Dual 表简介 在Oracle数据库中,`DUAL`表是一个特殊的表,通常被用于执行简单的查询或计算。它只有一个行和一个列,该列名为`DUMMY`,其数据类型为`VARCHAR2(1)`,并且值...
### Oracle中的SUBSTR函数详解 在Oracle数据库中,`SUBSTR`函数是一个非常重要的字符串处理函数,用于从指定的字符串中提取子串。该函数在实际应用中极为广泛,能够帮助用户灵活地处理数据,满足各种业务需求。下面...
Oracle常用日期型函数详解 1、Sysdate 当前日期和时间 Select sysdate from dual; SYSDATE ---------- 21-6月 -05 2、Last_day 本月最后一天 Select last_day(sysdate) from dual; LAST_DAY(S ---------- 30-6...
### ORACLE `replace` 和 `translate` 函数详解 在Oracle数据库中,处理字符串是非常常见的需求之一。为了更好地管理和操作数据,Oracle提供了多种内置函数来帮助我们实现这一目标。其中两个常用的函数是 `replace`...
在Oracle数据库中,SCN被用来跟踪并确保事务的正确提交和回滚,以及在数据库恢复过程中的精确性。 SCN的设计非常巧妙,它的值非常大,几乎不可能达到上限,从而保证了数据库操作的无冲突性。数据库管理员可以通过...
特殊字符可以在格式掩码中使用,例如'TH'、':'等,或者通过引号包含任何文本。 处理月份和年份时,ADD_MONTHS函数非常有用,它可以添加或减少指定的月份数。LAST_DAY函数则返回指定日期所在月份的最后一天。而TRUNC...
本文将深入探讨这两者,并展示如何在实践中使用它们。 **一、Oracle序列** 序列是一种特殊类型的数据库对象,它可以生成唯一的整数序列,常用于为数据库表的主键字段提供自动递增的值。序列的主要属性包括: 1. *...
在Oracle数据库中,掌握各种函数的使用方法对于进行数据处理和分析至关重要。以下是从给定的部分内容中提取并详细解释的几个重要函数。 #### 1. ASCII 该函数用于返回与指定字符相对应的十进制数字值。 ```sql SQL>...
### Oracle常用函数大全及详解 #### 一、概述 Oracle数据库是全球领先的数据库管理系统之一,在企业级应用领域占据着举足轻重的地位。为了更好地利用Oracle数据库的强大功能,掌握其内置的各种函数对于提高数据...
### Oracle常用函数与使用方法详解 #### 一、Oracle SQL函数概述 在Oracle数据库中,SQL函数被广泛用于处理各种数据类型,包括数值、字符、日期等,它们能够帮助我们更高效地进行数据检索和分析。本文将详细介绍...
### Oracle三思笔记:常用函数详解 #### 数值型函数(Number Functions) 数值型函数主要针对数字类型的数据进行处理,返回的也是数值型的结果。这些函数广泛应用于数学计算、数据分析等场景。 1. **MOD(n1, n2)** ...
### pg与oracle语法差异知识点详解 #### 一、空值处理 **PostgreSQL** 和 **Oracle** 在处理空值(`null`)方面存在显著差异: - **PostgreSQL**: `null` 和空字符串(`''`)被视为不同的值。这意味着在进行比较或...
select round(123.456, 0) from dual; 返回123 select round(123.456, 1) from dual; 返回123.5 select round(-123.456, 2) from dual; 返回-123.46 2.ceil和floor函数 ceil和floor函数在一些业务数据的时候,有时...
2. **调用函数**:函数可以直接在SQL查询中使用,如下: ```sql SELECT get_employee_name(7788) FROM dual; ``` **三、SCOTT库中的EMP表** SCOTT库是Oracle数据库中的一个示例数据库,包含多个表,其中最知名...
Oracle2: 1. 《Oracle8 优化技术》摘录 (第一章 安装) 2. 《Oracle8 优化技术》摘录 (第二章 ...50. 怎样在SQLPlus中使用 '&' 来实现自定义参数变量? 51. 怎样在查询记录时给记录加锁 52. 自动备份Oracle数据库
### Oracle中的TO_DATE和TO_CHAR函数详解 #### 一、TO_DATE函数 **TO_DATE**函数主要用于将字符串转换成日期格式。在Oracle数据库中,这是一个非常实用的功能,尤其是在处理日期和时间相关的数据时。 ##### 1. ...