代码之家  ›  专栏  ›  技术社区  ›  tahzibi.jafar

oracle pl/sql中的块边界

  •  0
  • tahzibi.jafar  · 技术社区  · 6 月前

    以下代码在Oracle PL/SQL中成功编译:

    BEGIN
    
       NULL;
        
     -- some codes
            
    END LOOP;
    

    我的问题是,在没有任何循环的情况下使用END LOOP是错误的,还是有任何特殊意义?

    1 回复  |  直到 6 月前
        1
  •  5
  •   Littlefoot    6 月前

    loop , 关于这点 ,不代表循环的结束-它是一个 标签 你本可以使用例如。

    SQL> begin
      2    null;
      3  end tahzibi;
      4  /
    
    PL/SQL procedure successfully completed.
    
    SQL>
    

    而且,正如你所看到的,它也很有效。


    怎么会?我认为,这与 命名 PL/SQL块(我们称之为“函数”或“过程”)(您的代码表示 匿名 PL/SQL块)。

    一个简单的例子:

    SQL> create or replace procedure p_test is   --> procedure name is P_TEST
      2  begin
      3    null;
      4  end p_test;   --> best practice says that we should END it with its name; hence P_TEST after END keyword
      5  /
    
    Procedure created.
    
    SQL>
    

    在匿名PL/SQL块中 标签 与任何名字都没有关系(很明显)。Oracle允许它,但同时忽略了它。你可以使用它,但不必——我们通常不会。

    如果你想让它变得有意义,那么在代码中创建一个标签并结束 begin-end 其中一部分带有该标签,以提高可读性,特别是在复杂的PL/SQL过程中。大致如下:

    SQL> begin
      2    <<compute_salary>>       --> this is the label
      3    begin
      4      null;
      5      -- here goes code that computes salaries and
      6      -- spreads thorugh 30 lines of code
      7    end compute_salary;      --> end that BEGIN-END block with the label name
      8  end;
      9  /
    
    PL/SQL procedure successfully completed.
    
    SQL>