Oracle 变量范围

Posted

技术标签:

【中文标题】Oracle 变量范围【英文标题】:Oracle Variable Scope 【发布时间】:2017-10-31 13:09:28 【问题描述】:

我对 Oracle 还很陌生,但已经进行了很好的搜索。有人可以解释与此相关的范围规则吗:

BEGIN
    DECLARE 
        Variable1 number := 1;

    BEGIN
       DECLARE 
        Variable2 number := 2;


        BEGIN  
            dbms_output.put_line('Variable1: ' || Variable1); 
            dbms_output.put_line('Variable2: ' || Variable2); 
        END;

        BEGIN  
            dbms_output.put_line('Variable1: ' || Variable1); 
            dbms_output.put_line('Variable2: ' || Variable2); 
        END;
    END;
END;

错误:

错误报告 - ORA-06550:第 17 行,第 55 列:PLS-00201:标识符 'VARIABLE2' 必须声明 ORA-06550:第 17 行,第 17 列:PL/SQL: 语句被忽略 06550. 00000 - “第 %s 行,第 %s 列:\n%s” *原因:通常是 PL/SQL 编译错误。 *行动:

为什么 Variable2 在我第二次尝试输出时不可用?有没有办法在第二个 BEGIN...END 块中访问 Variable2,或者这只是 Oracle 的工作方式?

我使用的是 Oracle 12c。谢谢!

【问题讨论】:

【参考方案1】:

我认为你的缩进欺骗了你: 块是(DECLARE 部分是可选的)

DECLARE
   ...
BEGIN
   ...
END

第二个输出显然是在声明变量 2 的块之后。

【讨论】:

谢谢@Turo,这完美地解释了它......基本上交换声明以批准适当的开始,解决了我的问题。【参考方案2】:

PL/SQL 块的格式如下:

DECLARE
  -- your variables
BEGIN
  -- your statements
END;

块的DECLARE 部分是可选的(但仍然是块的一部分)

所以你的代码是:

BEGIN                         -- Block 1 Start
  DECLARE                     -- Block 1.1 Start
    Variable1 number := 1;
  BEGIN
    DECLARE                   -- Block 1.1.1 Start
      Variable2 number := 2;
    BEGIN  
      NULL;
    END;                      -- Block 1.1.1 End

    BEGIN                     -- Block 1.1.2 Start
      NULL;
    END;                      -- Block 1.1.2 End
  END;                        -- Block 1.1 End
END;                          -- Block 1 End

您有 4 个 PL/SQL 块:

块 1 没有局部变量。 Block 1.1 嵌套在 Block 1 中,并声明了局部变量variable1 Block 1.1.1 嵌套在 Block 1.1 内(嵌套在 Block 1 内)并声明变量 variable2 并且可以访问其周围块的范围,因此可以看到 variable1。 块 1.1.2 嵌套在块 1.1 内(嵌套在块 1 内)并且没有局部变量,但可以访问其访问其周围块的范围,因此可以看到 variable1variable2 不在祖先范围内,但在同级范围内且不可见。

【讨论】:

以上是关于Oracle 变量范围的主要内容,如果未能解决你的问题,请参考以下文章

Oracle存储过程(转)

Oracle存储过程的学习

Oracle的存储过程基本写法

Oracle之PL/SQL编程_数据类型与定义变量和常量

循环遍历日期范围

日期 sysdate 范围与文字日期范围之间的 Oracle