Procedure
参数模式:in、out、in out
Procedure的创建
CREATE[OR REPLACE] PROCEDURE procedurename(arg1 [model] datatype,arg2 [model] datatype,…) IS/AS
BEGIN
END;
注意:
无参 时,创建不能有过程名称后面不需要()
eg:用procedure求n1~n2的和
CREATEORREPLACEPROCEDURE sp_sum(i ININTEGER,
j ININTEGER,
res OUTNUMBER) IS
i1 INTEGER := i;
j1 INTEGER := j;
sm INTEGER := 0;
BEGIN
WHILE i1 <= j1 LOOP
sm := sm + i1;
i1 := i1 + 1;
ENDLOOP;
res := sm;
END;
其实说到底,oracle还是对表的CRUD, Cursor的作用就很明显了,所以Cursor作为参数在procedure中的应用我们也要掌握好,这样才能熟练的运用之。
这种情况,先定义一个package,在package中定义一种Type
那么这个时候我们就定义了一个类型了,以后要创建一个cursor类型就可以直接这样来创建。
创建一个包,包里面包含一个TYPE为REF CURSOR的类型
CREATEORREPLACEPACKAGE typeutil IS
TYPE cur_type ISREFCURSOR;
END;
创建一个Procedure,用来遍历出emp表中的ename
CREATEORREPLACEPROCEDURE sp_print(cur_emp OUT typeutil.cur_type) IS
cur SYS_REFCURSOR;
BEGIN
OPEN cur FOR
SELECT ename form emp;
cur_emp := cur;
END;
调用Procedure
DECLARE
cur SYS_REFCURSOR;
vename VARCHAR2(20);
BEGIN
sp_print(cur);
LOOP
FETCH cur
INTO vename;
EXITWHEN cur%NOTFOUND;
dbms_output.put_line(vename);
ENDLOOP;
CLOSE cur;
END;
那我们可以很清晰的看到,先在package中定义了一个Type,为ref cursor,然后create procedure 目的来遍历emp中的ename,然后调用。这是方法一,显得有点繁琐,让我们看看方法二。
我们可以看到,这里直接引入了一种Type SYS_REFCURSOR,直接定义一个cursor就很方便了。看看具体PL的实现。
CREATEORREPLACEPROCEDURE sp_print2(cur_emp OUTSYS_REFCURSOR) IS
cur SYS_REFCURSOR;
BEGIN
OPEN cur FOR
SELECT ename FROM emp;
cur_emp := cur;
END;
CREATEORREPLACEPROCEDURE sp_test(cur_emp OUTVARCHAR2) IS
BEGIN
dbms_output.put_line('HELLOWORLD');
END;
注意,这里参数类型不需要给出指定的数字,PL会根据你的返回值,然后判断到底用多大的空间来接受,认为的给出参数的数字是错误的。
调用
Call 过程名(无参)
Call 过程名(参数)
Exec过程名(参数)
删除
drop proceduresp_name
查看
SELECT* FROM user_procedures;
查看过程源代码
SELECT TEXT FROMuser_source where name = ‘SP_SUM’
增加调试信息
ALTER PROCEDUREsp_name COMPILE DEBUG