Dual表小议

【项目实战】MySQL的DUAL表介绍 MySQL中的DUAL表是一个虚拟表,用于返回一个行。DUAL表只包含一列和一行数据。 阅读详情

本文所讨论的内容基于以下环境:
ORACLE 8i (8.1.7)

当前版本:1.0 (041215)

声明:本文所述的某些操作可能对系统产生重大影响,请慎重操作!本人不对此产生的任何后果负责!


Dual表小议

Dual表是ORACLE里比较特殊的表,在很多时候都能看到它。例如,我们要取系统时间:

SQL> select sysdate from dual;

SYSDATE
-----------
2004-12-15

但Dual表到底是怎么回事,我倒是想仔细探究一番。恰好,某日优快云社区ORACLE板块上,有网友把Dual表删了,这个更引起了我探究的兴趣。

先来看看系统里有多少对象是和Dual表有关的:

SQL> select OWNER,OBJECT_NAME,OBJECT_TYPE,TO_CHAR(CREATED,'YYYY-MM-DD') CREATEDATE from all_objects where object_name like '%DUAL%';

OWNER                          OBJECT_NAME                    OBJECT_TYPE        CREATEDATE
------------------------------ ------------------------------ ------------------ ----------
SYS                            DUAL                           TABLE              2000-02-27
PUBLIC                         DUAL                           SYNONYM            2000-02-27

可以看到在系统中存在一个DUAL的表,还有一个DUAL的同义词。

DUAL表的所有者是SYS,因为,DUAL是系统创建的,而SYS是根用户。而所有者为PUBLIC的SYNONYM则让DUAL对所有用户都是透明的,不需要加“SYS”前缀。

再来看一下,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表中仅有1列:DUMMY,为VARCHAR2(1)型。(很是困惑,ORACLE为什么要用VARCHAR(1)型,用CHAR(1)难道不好么?)从这样的表结构来看,DUAL表设计的目的就是要尽可能的简单,以减少检索的开销。
还有,DUAL表是建立在SYSTEM表空间的,第一是因为DUAL表是SYS这个用户建的,本来默认的表空间就是SYSTEM;第二,把这个可能经常被查询的表和用户表分开来存放,对于系统性能的是有好处的。

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

接下来看看DUAL表中的数据,事实上,DUAL表中的数据和ORACLE数据库环境有着十分重要的关系(ORACLE不会为此瘫痪,但是不少存储过程以及一些查询将无法被正确执行)。
SQL> select * from dual;

DUMMY
-----
X

在创建数据库之后,DUAL表中便已经被插入了一条记录。个人认为:DUMMY字段的值并没有什么关系,重要的是DUAL表中的记录数。
下面,试着把DUAL表中的数据删除,看看会出现什么结果:
SQL> delete from dual;

1 行 已删除

SQL> select * from dual;

DUMMY
-----

看起来很正常,那么来取一下系统时间来看看:
SQL> select sysdate from dual;

SYSDATE
-----------

这下子,我们便取不到系统日期了。因为,sysdate是个函数,作用于每一个数据行。现在没有数据了,自然就不可能取出系统日期。
这个对于很多用
select sysdate into v_sysdate from dual;
这种方式取系统时间以及其他信息的存储过程来说是致命的,因为,ORACLE会马上抛出一个NO_DATA_FOUND(ORA-01403)的异常,即使异常被捕获,存储过程也将无法正确完成要求的动作。

反过来,如果我们再插入一条数据,那会是什么结果呢?
SQL> insert into dual values('Y');

1 行 已插入

SQL> commit;

提交完成

SQL> select * from dual;

DUMMY
-----
X
Y
SQL> select sysdate from dual;

SYSDATE
-----------
2004-12-15
2004-12-15

这个时候返回的是两条记录,这样同样会引起问题。在通过使用

select sysdate into v_sysdate from dual;

来获取时间或者其他信息的存储过程来说,ORACLE会抛出TOO_MANY_ROWS(ORA-01422)异常。

因此,需要保证在DUAL表内有且仅有一条记录。当然,也不能把DUAL表的UPDATE,INSERT,DELETE权限随意释放出去,这样对于系统是很危险的。

最后,总结一下如果DUAL表被“不幸”删除后的恢复:
1. 以SYS登录。
2. 创建DUAL表(SQL如上述)。
3. 授予公众SELECT权限(SQL如上述,但不要给UPDATE,INSERT,DELETE权限)。
4. 向DUAL表插入一条记录(仅此一条): insert into dual values('X');
5. 提交修改。

其他:
对于如此重要的表,ORACLE不予以保护确实令我想不通(针对8i),但是对于DELETE操作来说,ORACLE却似乎在后面做了些什么。
SQL> select * from dual;

DUMMY
-----
X
Y

SQL> delete from dual;

1 行 已删除

SQL> commit;

提交完成

SQL> select * from dual;

DUMMY
-----
Y

不管表内有多少记录(没有记录除外),ORACLE对于每次DELETE操作都只删除了一条数据。这个又是为什么呢??

关于优化问题:
建立一个索引,可能是有用的,但是,如果能把DUAL表放入SGA是不是更好??可能不是,因为我们几乎从来都不关心DUMMY这个列是什么值(这次除外),ORACLE也不会关心的。


PS:
DUAL在英语里是双重的意思,取这个表名确实不好理解(可能是个人智商问题),DUMMY是虚的意思,这个倒是好理解,就当它没有吧…………
欢迎大家指教!

工业4.0 底层逻辑 工业4.0 的概念已经被滥用了,它与物联网,工业物联网等概念一样,几乎什么都往里面装。演变成了一句口号和愿景。许多人并不清楚工业4.0的底层逻辑到底是什么?如何遵循工业4.0 的思想构建新一代智能制造系统?并没用清晰地展示工业4.0的技术路线图。 阅读详情

相关推荐

VS2019 +osg3.6.5+ earth3.2+qt5.14.2+osgQt 编译教程

用vs新建工程,稍后会在写一篇博客上分享四、结语至此,所有的编译就均已完成。

king_ink的博客 1134

Oracle中dual表的用途介绍

Oracle中dual表的用途介绍 导读]dual是一个虚拟表,用来构成select的语法规则,oracle保证dual里面永远只有一条记录。我们可以用它来做很多事情。   dual是一个虚拟表,用来构成select的语法规则,oracle保证dual里面永远只有一条记录。我们可以用它来做很多事情,...

weixin_34293902的博客 520

PID详解

1、什么是PID及其作用 设定一个输出目标,反馈系统传回输出值,如与目标不一致,则存在一个误差,PID 根据此误差调整输入值,直至输出达到设定值. 为什么需要PID呢,比如控制温度,我们需要设置一个要达到的目标温度值,当将温度稳定在目标温度值 例如,我们希望水的目标温度值为70°,其希望无非就是可以快速而且无抖动的达到70°,并稳定在70° 如果我们使用普通的方式加热,当温度到达70°后就以及停止加热,岂不是简单快速,当然用在要求不高的场合也可以,但是如果要求更高的场合呢,会出现温度到达70°后......

weixin_48435215的博客 5万+

各种数据库中的dual表

MySQL文档中对于dual表的解释: You are allowed to specify DUAL as a dummy table name in situations where no tables are referenced: SELECT 1+1 AS SUM FROM DUAL; DUAL is purely for the convenience of people who require that all SELECT statements should have FROM and po

qq_16268979的博客 6648

stm32学习笔记-启动文件

1、配置栈 Stack_Size EQU 0x00000400 AREA STACK, NOINIT, READWRITE, ALIGN=3 Stack_Mem SPACE Stack_Size __initial_sp EQU:相当于C中的define,定义Stack_Size = 0x00000400。 AREA: 指...

某风吾起的博客 4529

手把手教你用芯驰X9HP驱动MAX96755/MAX96752点亮智能座舱仪表屏(附完整寄存器配置表)

本文详细介绍了如何使用芯驰X9HP驱动MAX96755/MAX96752实现智能座舱仪表屏的完整开发流程,包括硬件架构解析、关键寄存器配置、Linux BSP集成及调试技巧。通过实战指南和完整寄存器配置表,帮助开发者快速掌握驱动开发核心技术,提升智能座舱系统的显示性能与稳定性。

weixin_30879169的博客 526

dual表是什么表?

dual是Oracle提供给任何用户都可以使用的一个表。 常用在没有目标表的select语句中。也叫哑表,虚表。 一般不要对dual表进行更改操作,否则会导致很多程序出问题。 dual是个虚表,其中只有一列,当你查询时间或者日期等的时候就需要使用这个表,例如 select sysdate from dual;因为在oracle当中查询语句必须要有关键字 select ....from t

Madas_余焱的博客 2087

FPGA实现AXI-Stream通信

本文介绍了在FPGA中实现AXI-Stream接口的工业级方案,重点解析了核心协议信号(TVALID/TREADY/TDATA/TLAST)与可选扩展信号,并提供了Verilog最小化实现示例。文章详细阐述了握手协议规则、时序约束方法,以及吞吐量优化技巧(如寄存器切片和双缓冲策略),同时给出了跨时钟域处理的异步FIFO解决方案。此外,还包含验证调试方法(Testbench结构和ILA触发设置)和典型应用场景(视频处理/网络传输),最后提供了资源消耗参考数据。该实现方案严格遵循Xilinx/Intel官方规范

whm128的博客 1464

数据库中的DUAL表

DUAL表最早出现在Oracle数据库中,它是一个只有一行一列的伪表,通常用于执行计算或获取系统信息时作为占位符。随着数据库技术的发展,其他数据库管理系统(DBMS)也引入了类似的功能,例如MySQL、PostgreSQL等。

四楼没电梯的专栏 1960

AUTOSAR知识点:PDUR(PDU Router)基础知识

通过定义路由表和实现相应的路由和缓冲逻辑,PDUR能够确保PDU在不同ECU之间的可靠传输。在上述示例中,我们定义了一个简单的PDUR路由表,其中列出了源ECU和目标ECU之间的映射关系。当收到来自源ECU的PDU时,PDUR模块会根据路由表查找目标ECU,并将PDU传输到相应的目标ECU。PDUR的主要功能是将接收到的PDU从一个ECU路由到另一个ECU,并确保数据的正确传输。需要注意的是,上述示例是一个简化的实现,实际的PDUR模块可能包含更复杂的功能和逻辑。

EcmFsharp的博客 1157

Host是如何与EC通信的

EC中有三个寄存器,分别为状态寄存器EC_SC、命令寄存器EC_SC和数据寄存器EC_DATA。而状态寄存器和命令寄存器同属于一个寄存器,这几个寄存器遵循着ACPI EC规范。host可以根据ACPI协议规范来与EC进行通信。 以下是个寄存器的详细介绍。 EC状态寄存器(EC_SC(R)),该寄存器是一个只读寄存器,它反映了此时EC接口的状态。下图为该寄存器表。 EC状态寄存器表中各位的具体含义: OBF(Output Buffer is Full),该状态位置1...

qq_30135687的博客 3692

oracle dual

ORACLE DUAL表详解 1、DUAL表的用途Dual 是 Oracle中的一个实际存在的表,任何用户均可读取,常用在没有目标表的Select语句块中 --查看当前连接用户SQL> select user from dual;USER------------------------------SYSTEM --查看当前日期、时间SQL> select sysdate from dual;S

liuxl的专栏 827

Python 爬虫实战:Twitter 数据定向抓取(特定话题 + 用户推文爬取与分析)

在社交媒体研究、舆情监测和市场分析等领域,Twitter 数据具有极高的价值。本文将详细介绍如何使用 Python 构建一个完整的 Twitter 数据爬取系统,包括特定话题和用户推文的爬取与分析。我们将涵盖从认证到数据存储、清洗、分析和可视化的全流程。

u014481728的博客 1035

Java SDK中的sort算法小议 - 03 双轴快排

Java SDK中的sort算法小议 - 03 双轴快排Java SDK中的sort算法小议 - 03 双轴快排双轴快排 - `DualQuickSort`双轴快排对外入口 - `~DualPivotQuicksort.sort(int[] a, int left, int right, int[] work, int workBase, int workLen)`EJ双轴快排函数 - `-Dua...

pcsxk的专栏 519

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

WITH语法小议[zt]

from http://yangtingkun.itpub.net/post/468/202694Oracle9i新增了WITH语法功能,可以将查询中的子查询命名,放到SELECT语句的最前面。下面看一个简单的例子:SQL&gt...

cuiqingko849622的博客 144

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

DBMS_SESSION包小议(五)

除了使用ALTER SESSION设置会话的状态,利用V$SESSION查询会话状态,Oracle还提供了PL/SQL接口DBMS_SESSION来查询和设置会话相关的状态。 描述用来设置TRACE的SET_SQL_TRA...

ckawt40802的专栏 175

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

DBMS_SESSION包小议(二)

除了使用ALTER SESSION设置会话的状态,利用V$SESSION查询会话状态,Oracle还提供了PL/SQL接口DBMS_SESSION来查询和设置会话相关的状态。 描述SET_NLS过程。 DBMS_SESS...

ckawt40802的专栏 243

Oracle 9i数据库WITH查询语法小议(1)

Oracle 9i数据库WITH查询语法小议(1)作者: yangtingkun    专家blog CNETNews.com.cn 2007-10-10 15:05:42    Oracle9i新增了WITH语法功能,可以将查询中的子查询命名,放到SELECT语句的最前面。 下面看一个简单的例子:  

gseven888的专栏 531

oracle mod结果不正确,SQL和存储过程的结果不一致——小议Oracle的number精度问题...

今天看到一个有趣的问题,SQL得到的查询结果和存储过程不一致。首先模拟一下这个问题:SQL> CREATE OR REPLACE PROCEDURE P_TEST (P_IN NUMBER, P_OUT OUT NUMBER) IS2 BEGIN3 SELECT LOG(2, P_IN) INTO P_OUT FROM DUAL;4 DBMS_OUTPUT.PUT_LINE(P_O...

weixin_30227775的博客 513

DBMS_SESSION包小议(一)

除了使用ALTER SESSION设置会话的状态,利用V$SESSION查询会话状态,Oracle还提供了PL/SQL接口DBMS_SESSION来查询和设置会话相关的状态。 描述UNIQUE_SESSION_ID和IS_...

ckawt40802的专栏 244

SQL和存储过程的结果不一致——小议Oracle的number精度问题

今天看到一个有趣的问题,SQL得到的查询结果和存储过程不一致。 原始问题参加:http://www.itpub.net/showthread.php?s=&threadid=763283 首先模拟一下这个问题: SQL> CREATE OR REPLACE PROCEDURE P_TEST (P_IN NUMBER, P_OUT OUT NUMBER) IS 2 BEGIN

SUNMOONSTAR专栏 2979

Oracle中的dual表

2、DUAL表是一个单行单列的虚拟表,这个表只有1列DUMMY,数据类型为VARCHAR2(1),不论执行什么操作(不要删除记录),它都只有一条记录——“X”,Oracle有内部逻辑保证DUAL表中只有一条数据。1、DUAL表是Oracle提供的最小的工作表,是sys用户下的一张内部表,所有用户都可以使用DUAL名称访问,无论什么时候这个表总是存在。4、dual是Oracle中的一个实际存在的表,任何用户均可读取,常用在没有目标表的Select语句块中。2、查看当前日期、时间。1、查看当前连接用户。

KevinChen2019的博客 2679

Oracle数据库中神奇的dual表

写在前面: dual是一个单行单列的虚拟表 常用在没有目标表的Select语句块,用来构成select的语法规则 dual里面永远只有一条记录 Dual表主要用来选择系统变量或求一个表达式的值 DUAL就是个一行一列的表,如果你往里执行insert,delete,truncate操作,就会导致很多程序出问题 常见用法: select sysdate from dual; select user from dual; select to_char(sysdate,’yyyy-mm-dd.

LeeeeC的博客 2411

mysql dual表用法_详解Oracle数据库中DUAL表的使用

1、DUAL表的用途Dual 是 Oracle中的一个实际存在的表,任何用户均可读取,常用在没有目标表的Select语句块中--查看当前连接用户SQL> select user from dual;USER------------------------------SYSTEM--查看当前日期、时间SQL> select sysdate from dual;SYSDATE-------...

weixin_39774905的博客 1525

Oracle学习3:dual详解

Oracle学习3:dual详解

Liu_Arvin的芝士小栈 880

oracle 中 dual 详解

基本上oracle引入dual为的就是符合语法 1. 我们先从名称来说,dual不是缩写词,本身就是完整的单词。dual名词意思是对数,做形容词时是指二重的,二元的。 2. Oracle中的dual表是一个单行单列的虚拟表。 3. Dual表是oracle与数据字典一起自动创建的一个表,这个表只有1列:DUMMY,数据类型为VERCHAR2(1),dual表中只有一个数据'X', Oracl

oZhouHui的专栏 3万+
上一篇: 经典的大学四年心得【我不是原创,但是我举双脚同意】
下一篇: 在VC++开发环境中整合Pro*C/C++
doulikeme
博客等级 码龄24年 1粉丝 4原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值