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 内)并且没有局部变量,但可以访问其访问其周围块的范围,因此可以看到 variable1
。 variable2
不在祖先范围内,但在同级范围内且不可见。
【讨论】:
以上是关于Oracle 变量范围的主要内容,如果未能解决你的问题,请参考以下文章