1

PL/SQL では、予約語なのに変数 (sysdate) に名前を付けることができるのはなぜですか?

例えば、

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

これは、現在の日付ではなく、23を出力します。

4

1 に答える 1

1

PL/SQL ではなくSQL予約語だからsysdateです。SQL と PL/SQL では、予約語のセットが異なります。すべての SQL 予約語が PL/SQL 予約語でもあるわけではなく、その逆もあります。そのため、推奨されませんが、一部の SQL 予約語を二重引用符で囲まずに PL/SQL の識別子として使用できます。

sysdateand (たとえば)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ただし、 orという名前の列を持つテーブルを作成することはできませんadd

SQL> create table t1(
  2    sysdate varchar2(123)
  3  );
  sysdate varchar2(123)
  *
ERROR at line 2:
ORA-00904: : invalid identifier 

およびその逆。二重引用符で囲まずにPL/SQL 変数を (たとえば) 宣言することはできませんが、PL/SQL 予約語は SQL ではないため、ifという名前の列を持つテーブルを簡単に作成できます。ifif

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 に答える