Plsql 如果在PL/SQL存储过程中DECLARE是可选的,为什么DECLARE存在?

Plsql 如果在PL/SQL存储过程中DECLARE是可选的,为什么DECLARE存在?,plsql,declare,Plsql,Declare,我被告知可以在存储过程的声明部分省略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 varc

我被告知可以在存储过程的声明部分省略
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;
匿名块:

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;

是否清楚?

以下是创建pl/sql过程的语法。变量和游标的声明是基于需要的,不是强制性的。因此,如果要声明,请声明或忽略:

CREATE [OR REPLACE] PROCEDURE procedure_name
    [ (parameter [,parameter]) ]

IS
    [declaration_section]

BEGIN
    executable_section

[EXCEPTION
    exception_section]

END [procedure_name];
还需要添加
Declare
关键字未在过程中使用,因为声明块隐式存在

编辑: Declare关键字用于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关键字的示例,那么我将能够解释,我没有看到任何declare关键字。如果使用局部变量,declare关键字将在触发器主体的开头使用。(实际上,触发器主体是匿名块)。
DECLARE
 <constant name> CONSTANT <data type> := <value>;
 <constant name> CONSTANT <data type> DEFAULT <value>;
BEGIN
  <valid statement>;
EXCEPTION
  <exception handler>;
END;