Просто потому, что sysdate
является SQL зарезервированным словом, а не PL/SQL. SQL и PL/SQL имеют разный набор зарезервированных слов. Не все зарезервированные слова SQL также являются зарезервированными словами PL/SQL и наоборот. Таким образом, вы можете, хотя и не рекомендуется, использовать некоторые зарезервированные слова SQL в качестве идентификаторов в PL/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
И наоборот. Мы не можем объявить/переменную SQL PL (скажу) 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
Спасибо, что было довольно ясно. –