2

有人告诉我,我可以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;
4

2 回答 2

5

以下是创建 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;
于 2013-06-22T02:49:28.560 回答
1
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;

清楚吗?

于 2013-06-22T02:45:02.293 回答