Oracle的dual是啥东西啊

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Oracle的dual是啥东西啊相关的知识,希望对你有一定的参考价值。

Oracle的dual是什么东西啊,我原来以为是一张表,但是看到很多时候都有from dual,如下:
select concat('010-','88888888')||'转23' 高乾竞电话 from dual;
select * from dual;有没有什么记录,请帮忙解答,谢谢!

Oracle提供的最小的工作表,只有一行一列,具有某些特殊功用。

特性

1、Oracle提供的最小的表,不论进行何种操作(不要删除记录),它都只有一条记录——'X'。

例如:执行select * from dual,里面只有一条记录;执行insert into dual values('Y')后,再次查询dual表,仍然显示一条记录。

2、是sys用户下的一张内部表,所有用户都可以使用DUAL名称访问,无论什么时候这个表总是存在。

例如:执行一个查看当前日期的语句 select sysdate from dual,这条语句在放在放在任何一个oracle数据库当中都不会报错,所以一般做一些特定查询的时候用这个表是最稳妥的。

扩展资料

Oracle系统中dual表是一个“神秘”的表,网上有很多网友都对该表进行了测试,该表只有一行一列,其实该表和系统中的其他表一样,一样可以执行插入、更新、删除操作,还可以执行drop操作。

但是不要去执行drop表的操作,否则会使系统不能用,数据库起不了,会报Database startup crashes with ORA-1092错误。此时也不要慌乱,可以通过执行以下步骤来进行恢复。可以用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”

[an error occurred while processing this directive]

参考资料来源:百度百科-dual

参考技术A

dual是Oracle中的一个伪表,利用这个伪表可以设置或查看序列,或者是调用一些内置的函数,方便操作。

简单来说,dual表就是oracle与数据字典自动创建的一张表,这张表是一个单行单列的表,这个表只有1列:DUMMY,数据类型为VERCHAR2(1),dual表中只有一个数据'X', Oracle有内部逻辑保证dual表中永远只有一条数据。dual表主要是用来选择系统变量或是求一个表达式的值。

比如:

求系统当前时间

SELECT sysdate FROM daul

求系统当前时间,并按设定的格式显示

select to_char(sysdate,''yyyy-mm-dd hh24:mi:ss'') from dual;

当计算器使用

select 1+2 from dual

参考技术B 1. dual 确实是一张表.是一张只有一个字段,一行记录的表.
2.习惯上,我们称之为'伪表'.因为他不存储主题数据.
3. 他的存在,是为了操作上的方便.因为select 都是要有特定对象的.
如:select * from mytable ;
select * from myview;
等等.
但如果我们不需要从具体的表来取得表中数据,而是单纯地为了得到一些我们想得到的信息,并要通过select 完成时,就要借助一个对象,这个对象,就是dual;
如我们要计算 999*999 的值,可以用:
select 999*999 from dual;
来实现;
要拼接一个电话信息:
select concat('010-','88888888')||'转23' 高乾竞电话 from dual;

就变成了我们想要的格式输出.

4.当然,我们不一定要dual ,也可以这样做.例如:
create table mydual( dummy varchar2(1));
也可以实现和dual 同样的效果:
select 999*999 from mydual;
不过,dual 我们都用习惯了,就无谓自己再搞一套了.本回答被提问者采纳
参考技术C dual 你可以理解为一个 万能的虚拟表。

select 2+3 frmm dual;
select sequence.nextval into yourpid from dual;
select 'rrr'||'ggg' from dual;

等等的,主要的是 FROM关键字之前的部分,是主要关注的部分。
参考技术D 只有一条数据的 虚拟表
select * from dual;
用于计算一些系统时间、或者处理一些字符串、处理一些运算等等作用。

MS SqlServer 中的 Oracle“双”表的等价物是啥?

【中文标题】MS SqlServer 中的 Oracle“双”表的等价物是啥?【英文标题】:What is the equivalent of the Oracle "Dual" table in MS SqlServer?MS SqlServer 中的 Oracle“双”表的等价物是什么? 【发布时间】:2015-04-06 22:10:52 【问题描述】:

MS SqlServer 中的 Oracle “Dual”表的等价物是什么?

这是我的Select

SELECT pCliente,
       'xxx.x.xxx.xx' AS Servidor,
       xxxx AS Extension,
       xxxx AS Grupo,
       xxxx AS Puerto
FROM DUAL;

【问题讨论】:

【参考方案1】:

sql-server,没有dual你可以简单的做

SELECT pCliente,
       'xxx.x.xxx.xx' AS Servidor,
        xxxx AS Extension,
        xxxx AS Grupo,
        xxxx AS Puerto

但是,如果您的问题是因为您从 Oracle 传输了一些引用 dual 的代码,您可以重新创建表:

CREATE TABLE DUAL
(
DUMMY VARCHAR(1)
)
GO
INSERT INTO DUAL (DUMMY)
VALUES ('X')
GO

【讨论】:

最好更改查询,而不是在 SQL Server 中引入dual 表。 Oracle 的优化器将双表识别为特殊并跳过访问它,asktom.oracle.com/pls/asktom/… 谢谢,这也适用于 Virtuoso 开源数据库。 dual 最初是为一些内部用例创建的,在该用例中加入它会复制行,但在某些时候事情失控了,因为 Oracle 愚蠢地需要 @ 987654331@ 子句即使选择的值不需要表格。 什么时候我想使用JOIN clause 就像在这个例子中SELECT * FROM ( SELECT 'COL1' COL1, 'COL2' COL2, M FROM DUAL FULL OUTER JOIN (SELECT 'COL3-ROW1' M FROM DUAL UNION ALL SELECT 'COL3-ROW2' M FROM DUAL) ON 1=1 ) 一样 我遇到了类似的问题。我必须在自己编写查询的框架中编写特定的查询。我使用表(values('x')) DUAL(DUMMY) 从一个查询中检索结果,该查询有一个带有ANY 结果的单列(粗体表示框架,斜体表示我作为参数输入的内容):SELECT 'X' = ANY 的情况(从表中选择列)然后 1 ELSE 0 结束结果 FROM (VALUES('X')) DUAL(DUMMY) 。它适用于大多数 SQL 引擎。【参考方案2】:

mssql server 中不需要 DUAL

在甲骨文中

select 'sample' from dual

等于

SELECT 'sample'

在 sql 服务器中

【讨论】:

我认为没有理由在接受答案一年后回答同样的问题...... 相同的答案但更清晰。话虽如此,我在没有 FROM 的情况下运行了两个示例并得到了错误。【参考方案3】:

虽然您通常不需要 SQL Server 中的 DUAL 表,正如 Jean-François Savard 所解释的那样,但我过去出于语法原因需要模拟 DUAL。以下是三个选项:

创建DUAL 表或视图

-- A table
SELECT 'X' AS DUMMY INTO DUAL;

-- A view
CREATE VIEW DUAL AS SELECT 'X' AS DUMMY;

创建后,您可以像在 Oracle 中一样使用它。

使用公用表表达式或派生表

如果您只需要 DUAL 来作为单个查询的范围,也可以这样做:

-- Common table expression
WITH DUAL(DUMMY) AS (SELECT 'X')
SELECT * FROM DUAL

-- Derived table
SELECT *
FROM (
  SELECT 'X'
) DUAL(DUMMY)

【讨论】:

【参考方案4】:

在 SQL Server 中没有双表。如果你想放一个WHERE子句,你可以简单的直接这样放:

SELECT 123 WHERE 1<2

我认为在 MySQL 和 Oracle 中,他们需要一个 FROM 子句才能使用 WHERE 子句。

SELECT 123 FROM DUAL WHERE 1<2

【讨论】:

不确定为什么人们不喜欢 Heng 的答案 - Heng 扩展了之前的答案,Heng 指出您也可以使用 where 子句而不使用 from ,而其他解决方案没有提到.

以上是关于Oracle的dual是啥东西啊的主要内容,如果未能解决你的问题,请参考以下文章

oracle dual是啥表

dual在oracle中是啥意思?

openjdk到底是啥东西啊?有啥作用啊?是否说在linux下编写java程序必须安装openjdk啊?谢谢回答。

postgresql 有没有 类似于 oracle 的dual 表啊解决方案

Spinfire是啥东西啊?

action 具体是啥东西啊?