1

在 PL/SQL 中......为什么可以命名一个变量(sysdate),尽管它是一个保留字?

例如,

set serveroutput on;    
declare sysdate integer := 23;
begin
dbms_output.put_line(sysdate);
end;

输出:23而不是当天的日期。

4

1 回答 1

1

仅仅sysdate是因为SQL保留字不是PL/SQL。SQL 和 PL/SQL 有不同的保留字集。并非所有 SQL 保留字也是 PL/SQL 保留字,反之亦然。因此,尽管不推荐,但您可以在 PL/SQL 中使用一些 SQL 保留字作为标识符,而不用双引号将它们括起来:

sysdateand (say)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  

但是我们不能创建一个列名为sysdateor的表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,因为ifPL/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
于 2013-12-02T16:30:49.270 回答