当前位置: 首页 > 知识库问答 >
问题:

Oracle变量范围

谯翔
2023-03-14

我对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。谢谢

共有2个答案

蓬琦
2023-03-14

PL/SQL块的格式为:

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

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

因此,您的代码是:

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没有局部变量
姬国安
2023-03-14

我认为你的缩进在愚弄你:一个块是(DECLARE部分是可选的)

DECLARE
   ...
BEGIN
   ...
END

第二个输出显然在声明Variable2的块之后。

 类似资料:
  • 本章介绍当模板在访问变量时发生了什么事情,还有变量是如何存储的。 当调用 Template.process 方法时,它会在方法内部创建一个 Environment 对象,在 process 返回之前一直使用。 该对象存储模板执行时的运行状态信息。除了这些,它还存储由模板中指令,如 assign, macro, local 或 global 创建的变量。 它不会尝试修改传递给 process 的数据

  • 问题内容: 我知道变量作用域由块的开始和块的结尾包围。如果在块内声明了相同的变量,则会发生编译错误。但是,请看以下示例。 在这里,可以在方法中重新声明,尽管它已经在类中声明了。但是在块中,无法重新声明。 为什么类范围变量的重新声明不产生错误,而方法范围变量的重新声明却产生错误? 问题答案: 这是因为不是变量,而是实例字段。允许局部变量与字段具有相同的名称。为了区分变量和具有相同名称的字段,我们在实

  • 问题内容: 我知道变量作用域由块的开始和块的结尾包围。如果在块内声明了相同的变量,则会发生编译错误。但是,请看以下示例。 在这里,可以在方法中重新声明,尽管它已经在类中声明了。但是在块中,无法重新声明。 为什么类范围变量的重新声明不产生错误,而方法范围变量的重新声明却产生错误? 问题答案: 这是因为不是变量,而是实例字段。允许局部变量与字段具有相同的名称。为了区分变量和具有相同名称的字段,我们在实

  • 问题内容: 这将编译 这不会 我希望两者都能编译(也许这是C的工作方式?)。是什么原因导致无法在外部块中以相同的名称声明一个块中的变量? 问题答案: 简短的答案是:因为这是JLS§6.4中定义Java语言的方式。 您可能从其他语言中使用过,因此允许使用所谓的可变阴影。但是,Java语言的发明者认为这是一个笨拙的功能,他们不希望使用其语言: 此限制有助于检测其他一些非常模糊的错误。 但是,正如作者在

  • 问题内容: 我正在使用dgrid,并且尝试在外部设置dataStore。当页面加载时,我打电话来创建网格。在网格加载时,null为null。执行查询时,将设置。 没有错误,但是网格仍然是空的。正在使用数据更新aliasStore,但是即使刷新了网格也没有将其反映在网格上。查询后如何获取反映在网格中的数据? Javascript对象 设置数据存储数据 问题答案: 您正在将“ this.Store”设

  • 问题内容: 我正在阅读“ CreateSpace Go 2012编程入门” 在第86页上,我发现了这种邪恶的魔力 1)为什么不复位?2)正在返回,或者是否如此聪明以至于它可以与所有东西配合使用? 问题答案: 为了清楚起见,我将为这两个函数分配名称: 工厂返回闭包–函数是Go中的一等公民,即它们可以是右手表达式,例如: 在您的代码中,闭包环绕工厂的上下文,这称为 词法作用域 。这就是变量在闭包内部可