Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oracle变量范围_Oracle_Plsql_Scope_Oracle12c - Fatal编程技术网

Oracle变量范围

Oracle变量范围,oracle,plsql,scope,oracle12c,Oracle,Plsql,Scope,Oracle12c,我对甲骨文还不太熟悉,但已经进行了很好的搜索。有人能解释与此相关的范围规则吗: BEGIN DECLARE Variable1 number := 1; BEGIN DECLARE Variable2 number := 2; BEGIN dbms_output.put_line('Variable1: ' || Variable1); dbms_outp

我对甲骨文还不太熟悉,但已经进行了很好的搜索。有人能解释与此相关的范围规则吗:

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: 忽略语句 655000000-“行%s,列%s:\n%s” *原因:通常是PL/SQL编译错误。 *行动:

为什么Variable2在我第二次尝试输出时不可用?是否有一种方法可以在第二个BEGIN…END块中访问Variable2,或者这就是Oracle的工作方式


我正在使用Oracle 12c。谢谢

我认为你的缩进是在愚弄你: 块是(声明部分是可选的)


第二个输出明显位于声明Variable2的块之后。

我认为您的缩进在愚弄您: 块是(声明部分是可选的)


第二个输出明显位于声明Variable2的块之后。

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没有局部变量
  • 块1.1嵌套在块1内,并声明局部变量
    variable1
  • 块1.1.1嵌套在块1.1内(嵌套在块1内),并声明变量
    variable2
    ,可以访问其周围块的范围,以便查看
    variable1
  • 块1.1.2嵌套在块1.1内(嵌套在块1内),没有局部变量,但可以访问其周围块的范围,因此可以查看
    variable1
    variable2
    不在祖先的作用域中,但在同级中且不可见

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没有局部变量
  • 块1.1嵌套在块1内,并声明局部变量
    variable1
  • 块1.1.1嵌套在块1.1内(嵌套在块1内),并声明变量
    variable2
    ,可以访问其周围块的范围,以便查看
    variable1
  • 块1.1.2嵌套在块1.1内(嵌套在块1内),没有局部变量,但可以访问其周围块的范围,因此可以查看
    variable1
    variable2
    不在祖先的作用域中,但在同级中且不可见

谢谢,@Turo,这很好地解释了这一点……基本上交换了声明以批准适当的开始,解决了我的问题。谢谢,@Turo,这很好地解释了这一点……基本上交换了声明以批准适当的开始,解决了我的问题。