伪列和DUAL表 - 它们实际上是什么意思?

Vij*_*jay 5 sql oracle dual-table

双表用于选择伪列.它有一行和一列DUMMY,其值为X.

我有两个问题

  1. 伪列的意思是什么?
  2. 双能如何赋予价值例如:

    select sysdate from dual
    
    Run Code Online (Sandbox Code Playgroud)

    将导致当前的日期时间.这怎么可能?

APC*_*APC 7

伪列是返回系统生成值的函数. sysdate是一个返回当前日期时间的函数; rownum是一个伪列,它返回结果集中的行号.

在我们使用PL/SQL之前,术语可以追溯到Oracle的早期阶段.它只是意味着我们可以在SELECT语句的投影中使用这些函数,就像表的列一样.现在我们可以编写自己的函数并在SQL语句中使用它们而不会闪烁,因此短语"伪列"有点令人困惑.

区分函数和伪列的特性是伪列为结果集中的每一行返回不同的值,而函数返回相同的值(除非表中的某些列作为参数传递以派生值).

Dual是Oracle历史上另一个值得尊敬的片段.它是一个包含一行的表,数据库知道它包含一行.所以你引用的select语句只是说"给我当前的日期时间".它在功能上等同于

select sysdate 
from emp
where rownum = 1
/
Run Code Online (Sandbox Code Playgroud)

在PL/SQL中,从双重选择是无效的.我们可以编写代码:

l_date := sysdate;
Run Code Online (Sandbox Code Playgroud)

DUAL的一个常见用途是在触发器中获取序列的下一个值.自11g以来我们可以......

:new.id := my_seq.nextval;
Run Code Online (Sandbox Code Playgroud)

在封面下,这仍然执行 select my_seq.nextval into :new.id from dual;

  • 功能上等效-除非`emp`为空:) (2认同)