【问题标题】:Why does DECLARE exist if it is optional in PL/SQL stored procedures?如果 DECLARE 在 PL/SQL 存储过程中是可选的,为什么还要存在呢?
【发布时间】:2013-06-22 02:04:35
【问题描述】:

有人告诉我,我可以在存储过程的声明部分中省略 declare 关键字。 declare 关键字对于声明部分是可选的吗?如果是,那它为什么存在呢?

create or replace procedure myproc is

-- starting Declaration section
DECLARE  -- is DECLARE keyword optional? Can i omit it here?
cursor mycursor as
select ...;
var1 number;
var2 varchar2;
-- end of Declaration section

BEGIN
...
END myproc;

【问题讨论】:

    标签: plsql declare


    【解决方案1】:

    以下是创建 pl/sql 过程的语法。变量和游标的声明是根据需要而不是强制性的。所以如果你想声明然后声明 else 忽略:

    CREATE [OR REPLACE] PROCEDURE procedure_name
        [ (parameter [,parameter]) ]
    
    IS
        [declaration_section]
    
    BEGIN
        executable_section
    
    [EXCEPTION
        exception_section]
    
    END [procedure_name];
    

    还想补充一点,Declare 关键字没有在过程中使用,因为声明块隐式存在。

    编辑: 对于声明块不是隐式的情况,存在声明关键字。假设是匿名块,现在这里你需要指定 Declare 块,否则将没有地方声明变量。

    匿名块的语法

    DECLARE
     <constant name> CONSTANT <data type> := <value>;
     <constant name> CONSTANT <data type> DEFAULT <value>;
    BEGIN
      <valid statement>;
    EXCEPTION
      <exception handler>;
    END;
    

    【讨论】:

    • 谢谢,我见过很多程序...有时DECLARE关键字被用在声明部分的开头,有时,声明部分开始时没有DECLARE
    • 查看我的编辑。另外,如果您可以发布或指向使用声明关键字的示例,那么我将能够解释,我还没有看到任何内容。
    • 如果使用局部变量,则在触发器主体的开头使用 DECLARE 关键字。 (实际上,触发器主体是一个匿名块)。
    【解决方案2】:
    create or replace procedure myproc is
    DECLARE
        cursor mycursor as select 1 from dual;
    
        var1 TABLE1%ROWTYPE;
    BEGIN
        NULL;
    END myproc;
    /*
    PROCEDURE MYPROC compiled
    Errors: check compiler log
    */
    
    create or replace procedure myproc is
        /* DECLARE */
        cursor mycursor /*as*/ is select 1 from dual;
    
        var1 TABLE1%ROWTYPE;
    BEGIN
        NULL;
    END myproc;
    /*
    PROCEDURE MYPROC compiled
    */
    

    匿名块:

    DECLARE
    /* declaration section */
    
    BEGIN
    /* code execution */
    
    END;
    

    存储过程:

    CREATE OR REPLACE PROCEDURE example_proc
    IS
    /* declaration section */
    
    BEGIN
    /* code execution */
    
    END;
    

    功能:

    CREATE OR REPLACE FUNCTION example_fun RETURN NUMBER
    IS
    /* declaration section */
    
    BEGIN
    /* code execution */
    
    END;
    

    在匿名块中,您在需要时使用声明部分(当您需要声明某些内容时),即变量:

    DECLARE
        l_var NUMBER;
    BEGIN
        SELECT  1
        INTO    l_var
        FROM    DUAL;
    
        DBMS_OUTPUT.PUT_LINE(TO_CHAR(l_var));
    END;
    -- anonymous block completed
    -- 1
    

    有时你不需要声明任何东西,即:

    CREATE OR REPLACE PACKAGE my_print IS
        PROCEDURE my_line;
    END my_print;
    -- PACKAGE MY_PRINT compiled
    
    CREATE OR REPLACE PACKAGE BODY my_print IS
        PROCEDURE my_line
        IS
            /* nothing to declare */
        BEGIN
            DBMS_OUTPUT.PUT_LINE('a string');
        END my_line;
    END my_print;
    -- PACKAGE BODY MY_PRINT compiled
    
    /* nothing to declare */
    BEGIN
        my_print.my_line;
    END;
    -- anonymous block completed
    -- a string
    

    ...或者简单地说:

    /* nothing to declare */
    BEGIN
        DBMS_OUTPUT.PUT_LINE('a string');
    END;
    

    ...或:

    BEGIN
        INSERT INTO a_table
        SELECT * FROM b_table WHERE d_date > TO_DATE('2013-01-01','YYYY-MM-DD');
    
        COMMIT;
    END;
    

    清楚吗?

    【讨论】:

      猜你喜欢
      • 2016-09-20
      • 1970-01-01
      • 1970-01-01
      • 2011-10-12
      • 1970-01-01
      • 2017-04-13
      • 2014-11-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多