双表用于选择伪列。 它有一行和一列DUMMY,其值为X。
我有两个问题
双人如何能够给出 值例如:
select sysdate from dual
将导致当前的日期时间。这怎么可能?
答案 0 :(得分:6)
伪列是返回系统生成值的函数。 sysdate
是一个返回当前日期时间的函数; rownum
是一个伪列,它返回结果集中的行号。
在我们使用PL / SQL之前,命名法可以追溯到Oracle的早期阶段。它只是意味着我们可以在SELECT语句的投影中使用这些函数,就像表的列一样。现在我们可以编写自己的函数并在SQL语句中使用它们而不会闪烁,因此短语“伪列”有点令人困惑。
区分函数和伪列的功能是伪列为结果集中的每一行返回不同的值,而函数返回相同的值(除非在table作为参数传递以派生值)。
Dual是Oracle历史上另一个值得尊敬的片段。它是一个包含一行的表,而数据库知道的包含一行。所以你引用的select语句只是说“给我当前的日期时间”。它在功能上等同于
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;
答案 1 :(得分:1)
SQL有许多内置函数,在它们之后不需要括号来调用它们。 Oracle中的一个这样的功能是SYSDATE。
请记住,如果您有一个表,则没有限制条件的SELECT语句(WHERE子句)通常会为表中的每一行返回一行数据。所以,给出一个表:
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具有其他不同的伪列,用于不同的目的。
有时很难区分伪列和函数。
答案 2 :(得分:0)
伪列是Oracle分配的值(伪字段),但未存储在磁盘上。
Pseudocolumns不是表中的实际列,但它们的行为类似于列。
例如,您可以从伪列中选择值。但是,您无法从伪列插入,更新或删除。另请注意,SQL语句中允许使用伪列,但程序语句中不允许使用伪列。
注意: - SQL语句中允许使用伪列,但程序语句中不允许使用伪列。
SQL> SELECT sysdate,systimestamp FROM dual; SYSDATE SYSTIMESTAMP
13-DEC-07 13-DEC-07 10.02.31.956842 AM +02:00
答案 3 :(得分:0)
伪列:ROWID,ROWNUM,LEVEL