存储过程
说明
CREATE PROCEDURE
与CREATE FUCTION类似,模式和用户是分开的对象,如果在其他模式下创建或替换存储过程,必须拥有这个模式上的CREATE权限。
- 支持AS关键字
- 支持不带language。
- 默认情况下存储过程名后面必须带(),无参存储过程可以不带()。
- 存储过程结束END; 语句后面在psql中以/结束。
- 创建存储过程变量声明前必须指定DECLARE关键字。
代码示例:
CREATE OR REPLACE PROCEDURE proc(a IN int)
IS
BEGIN
NULL;
END;
/
ALTER PROCEDURE
ALTER PROCEDURE语句显式重新编译独立的存储过程(procedure)。ALTER PROCEDURE不会改变现有存储过程的声明或定义。
如果ALTER PROCEDURE存储过程使用COMPILE语句编译函数没有任何编译错误,那么存储过程的状态是valid,数据库接下来执行存储过程时,在运行时不需要重新编译这个存储过程。如果ALTER PROCEDURE存储过程 COMPILE;语句有编译错误,存储过程的状态还是invalid。
数据库也验证依赖这个存储过程的所有对象,如果没有调用ALTER PROCEDURE COMPILE显示的重新编译存储过程,在运行时还是会重新存储过程。
代码示例:
CREATE OR REPLACE PROCEDURE proc(a IN int)
IS
BEGIN
NULL;
END;
/
Procedure created.
ALTER PROCEDURE proc COMPILE;
DROP PROCEDURE
使用DROP PROCEDURE删除存储过程不可以使用DROP PROCEDURE 删除package中的存储过程。
如果存储过程只有一个,可以使用DROP PROCEDURE procedure_name语句删除存储过程,不需要指定参数类型。如果存储过程有多个,必须指定参数。
代码示例:
CREATE OR REPLACE PROCEDURE proc(a IN int)
AS
BEGIN
NULL;
END;
/
DROP PROCEDURE proc;
OUT参数
存储过程中的out参数是输出模式的参数,用于输出值,会忽略传入的值,在子程序内部可以对其进行修改,子程序执行完毕后,out模式参数最终的值会赋值给调用时对应的实参变量,其中out模式参数的调用,必须通过变量。
create or replace procedure proc (
a integer,
b in integer,
c out integer,
d in out BINARY_FLOAT
)
as
declare
begin
raise notice ‘Inside procedure proc:’;
raise notice ‘IN a = %’, a;
raise notice ‘IN b = %’, b;
raise notice ‘OUT c = %’, c;
raise notice ‘IN OUT d =%’, d;
c := a+10;
d := 40/20;
end;
/
declare
aa CONSTANT integer := 1;
bb integer := 2;
ee integer;
ff binary_float := 5;
begin
call proc (1,
(bb+3)*4,
ee,
ff
);
raise notice ‘after procedure p:’;
raise notice ‘IN aa = %’, aa;
raise notice ‘IN bb = %’, bb;
raise notice ‘OUT ee = %’, ee;
raise notice ‘IN OUT ff =%’ ,ff;
end;
/