【问题标题】:Oracle db - naming a variable (sysdate)Oracle db - 命名变量 (sysdate)
【发布时间】:2013-12-02 16:11:00
【问题描述】:

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

例如,

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

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

【问题讨论】:

    标签: oracle sysdate


    【解决方案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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-04-08
      • 1970-01-01
      • 1970-01-01
      • 2013-11-08
      • 1970-01-01
      • 2019-04-04
      • 2011-11-01
      • 2022-01-16
      相关资源
      最近更新 更多