PL/SQL では、予約語なのに変数 (sysdate) に名前を付けることができるのはなぜですか?
例えば、
set serveroutput on;
declare sysdate integer := 23;
begin
dbms_output.put_line(sysdate);
end;
これは、現在の日付ではなく、23を出力します。
PL/SQL ではなくSQL予約語だからsysdate
です。SQL と PL/SQL では、予約語のセットが異なります。すべての SQL 予約語が PL/SQL 予約語でもあるわけではなく、その逆もあります。そのため、推奨されませんが、一部の SQL 予約語を二重引用符で囲まずに PL/SQL の識別子として使用できます。
sysdate
and (たとえば)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
という名前の列を持つテーブルを簡単に作成できます。if
if
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