【发布时间】:2013-12-02 16:11:00
【问题描述】:
在 PL/SQL 中...为什么可以命名一个变量 (sysdate) 虽然它是一个保留字?
例如,
set serveroutput on;
declare sysdate integer := 23;
begin
dbms_output.put_line(sysdate);
end;
输出:23,而不是当天的日期。
【问题讨论】:
在 PL/SQL 中...为什么可以命名一个变量 (sysdate) 虽然它是一个保留字?
例如,
set serveroutput on;
declare sysdate integer := 23;
begin
dbms_output.put_line(sysdate);
end;
输出:23,而不是当天的日期。
【问题讨论】:
仅仅是因为sysdate 是SQL 保留字而不是PL/SQL。 SQL 和 PL/SQL 有不同的保留字集。并非所有 SQL 保留字也是 PL/SQL 保留字,反之亦然。因此,尽管不推荐,但您可以在 PL/SQL 中使用一些 SQL 保留字作为标识符,而不用双引号将它们括起来:
sysdate 和(比如)add 是 SQL 保留字,所以我们可以在 PL/SQL 中将它们用作变量,而不用用双引号括起来:
SQL> set serveroutput on;
SQL> clear screen;
SQL> set feedback off;
SQL> declare
2 sysdate varchar2(123);
3 add number;
4 begin
5 sysdate := 'aaaaa';
6 add := 123;
7 dbms_output.put_line(sysdate || ' - ' ||to_char(add));
8 end;
9 /
结果:
aaaaa - 123
但我们无法创建包含名为 sysdate 或 add 的列的表:
SQL> create table t1(
2 sysdate varchar2(123)
3 );
sysdate varchar2(123)
*
ERROR at line 2:
ORA-00904: : invalid identifier
反之亦然。我们不能声明一个 PL/SQL 变量(比如)if 而不用双引号括起来,但是我们可以轻松地创建一个包含名为if 的列的表,因为if 不是 PL/SQL 保留字SQL:
SQL> create table t1(
2 if varchar2(111)
3 );
table T1 created.
SQL> declare
2 if number;
3 begin
4 if := 123;
5 end;
6 /
if number;
*
ERROR at line 2:
ORA-06550: line 2, column 3:
PLS-00103: Encountered the symbol "IF" when expecting one of the following:
但是当我们将if 放在双引号中时(尽量避免它)一切都会好起来的:
SQL> declare
2 "if" number;
3 begin
4 "if" := 123;
5 end;
6 /
anonymous block completed
【讨论】: