Oracle db - 命名变量(sysdate)

时间:2013-12-02 16:11:01

标签: oracle sysdate

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

例如,

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

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

1 个答案:

答案 0 :(得分:1)

只是因为sysdateSQL保留字而不是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  

但是我们无法创建一个名为sysdateadd的列的表:

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