在PL / SQL中...为什么可以命名一个变量(sysdate),尽管它是一个保留字?
例如,
set serveroutput on;
declare sysdate integer := 23;
begin
dbms_output.put_line(sysdate);
end;
输出: 23 ,而不是当天的日期。
答案 0 :(得分:1)
只是因为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