2013-12-02 2 views

ответ

1

Просто потому, что 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 
+0

Спасибо, что было довольно ясно. –

Смежные вопросы