双表用于选择伪列。它有一行和一列 DUMMY,其值为 X。
我有两个问题
- 伪列实际上是什么意思?
例如,对偶如何给出值:
select sysdate from dual
将导致当前日期时间。这怎么可能?
双表用于选择伪列。它有一行和一列 DUMMY,其值为 X。
我有两个问题
例如,对偶如何给出值:
select sysdate from dual
将导致当前日期时间。这怎么可能?
伪列是返回系统生成值的函数。 sysdate
是一个返回当前日期时间的函数;rownum
是一个伪列,它返回结果集中的行号。
术语可以追溯到 Oracle 的早期,在我们有 PL/SQL 之前。这只是意味着我们可以在 SELECT 语句的投影中使用这些函数,就像表的列一样。现在我们可以编写自己的函数并在 SQL 语句中使用它们而不会眨眼,所以“伪列”这个短语有点令人困惑。
函数与伪列的区别在于伪列为结果集中的每一行返回不同的值,而函数返回相同的值(除非表中的某些列作为参数传递以导出该值)。
Dual 是 Oracle 历史上另一个值得尊敬的部分。它是一个包含一行的表,数据库知道它包含一行。所以你引用的选择语句只是说“给我当前的日期时间”。它在功能上等同于
select sysdate
from emp
where rownum = 1
/
在 PL/SQL 中,从对偶中选择是无效的。我们可以这样编码:
l_date := sysdate;
DUAL 的一个常见用途是获取触发器中序列的下一个值。从 11g 开始,我们可以做...
:new.id := my_seq.nextval;
在幕后,这仍然执行select my_seq.nextval into :new.id from dual;
SQL 有许多内置函数,它们后面不需要括号来调用它们。Oracle 中的一个这样的功能是 SYSDATE。
请记住,如果您有一张表,那么没有限制条件(WHERE 子句)的 SELECT 语句通常会为表中的每一行返回一行数据。所以,给定一张表:
CREATE TABLE Ex1(Dummy CHAR(10) NOT NULL);
INSERT INTO Ex1 VALUES('Abacus');
INSERT INTO Ex1 VALUES('Sedentary');
INSERT INTO Ex1 VALUES('Caucasus');
运行 SELECT 语句:
SELECT Dummy FROM Ex1;
将返回 3 行。现在,假设我将语句写为:
SELECT 'ABC', Dummy, SYSDATE FROM Ex1;
这也将返回 3 行:
如果我省略 Dummy 列:
SELECT 'ABC', SYSDATE FROM Ex1;
我得到:
如果我省略字符串文字:
SELECT SYSDATE FROM Ex1;
我得到:
我删除了两行并重新运行查询,我得到:
DELETE FROM Ex1 WHERE Dummy > 'B';
SELECT SYSDATE FROM Ex1;
我得到:
因为表 Ex1 中只有一行数据。
名义上,我可以这样做:
UPDATE Ex1 SET Dummy = 'X';
RENAME TABLE Ex1 AS Dual;
当然,你不能这样做——我不确定 Oracle 是否支持 RENAME TABLE 语句,它可能不会让你重命名你的表,所以它可能会与内置的 DUAL 表混淆。但从概念上讲,其中包含单行的表 Ex1 与 DUAL 同构。
除非 Oracle 对该术语有特定的特殊含义,否则伪列是看起来是表的一部分但实际上并未作为数据存储在表中的列。一个经典的例子是行号:
SELECT ROWNUM, * FROM SomeTable
输出似乎有一个 ROWNUM 列(Informix 中的 ROWID,我最熟悉),但它并不直接存储在 DBMS 中。不同的 DBMS 有其他不同的伪列,用于不同的目的。
有时很难区分伪列和函数。
伪列是 Oracle 分配的值(伪字段),但不存储在磁盘上。
伪列不是表中的实际列,但它们的行为类似于列。
例如,您可以从伪列中选择值。但是,您不能在伪列中插入、更新或删除。另请注意,SQL 语句中允许使用伪列,但过程语句中不允许使用伪列。
注意:- SQL 语句中允许使用伪列,但过程语句中不允许使用伪列。
SQL> SELECT sysdate, systimestamp FROM dual; SYSDATE SYSTIMESTAMP
13-DEC-07 13-DEC-07 10.02.31.956842 AM +02:00
伪列:ROWID、ROWNUM、LEVEL