存储过程小结:
CREATE OR REPLACE PROCEDURE AXAPC.SP_PRINT_REPORT (IN_PARAM01 IN CHAR, IN_OUT_PARAM02 IN OUT CHAR, OUT_PARAM03 OUT VARCHAR2) AS NOWAITLOCKED EXCEPTION; PRAGMA EXCEPTION_INIT(NOWAITLOCKED,-00054); TEMP_PARAM01 DATE; TEMP_PARAM02 %TYPE; CURSOR FCRCURSOR IS SELECT * FROM T_TEST_TABLE01; BEGIN OUT_PARAM03 := '1'; TMP_FCR_NO := ''; FOR FCRDATA IN FCRCURSOR LOOP TEMP_PARAM01 := ''; TEMP_PARAM02 := ''; EXECUTE IMMEDIATE 'ALTER SESSION SET NLS_CALENDAR="GREGORIAN"'; FCRCOMMENT := 'FCR入力 ' || TO_CHAR(FCRDATA.CREAT_DT, 'YYYY/MM/DD HH24:MI'); END LOOP; COMMIT; --lockを取れない。 EXCEPTION WHEN NOWAITLOCKED THEN --結果が2、lockを取れない OUT_PARAM03 := '2'; ROLLBACK; RETURN; WHEN OTHERS THEN OUT_PARAM03 := '1'; ROLLBACK; RETURN; END; /
1.创建过程
过程参数有IN,OUT,IN OUT三种模式。
IN:传入的参数。过程中值不能改变。
OUT:返回的参数,在过程内部赋值。
IN OUT:即是传入的参数,也是返回的参数。过程运行时已经有具体值,过程中也可以修改。
2.AS/IS 声明过程中用到的临时变量。
EXCEPTION,CURSOR等也是在这里声明。
EXCEPTION 用以下语句声明。其中,00054是ORACLE内部定义的编号。这个异常没有名字。我们根据异常的内容可以定一个有意义的名字。如果不知道编号,可以让程序出现这个异常。就可以找到这个编号了。
NOWAITLOCKED EXCEPTION;
PRAGMA EXCEPTION_INIT(NOWAITLOCKED,-00054);
3.过程体
BEGIN END中间是过程体。
其中比较重要的是对CURSOR的操作。
一般对游标的操作有以下几个步骤:
a。声明一些变量,用来保存Select的列值
b。声明游标
c。打开游标 open 游标名
d。从游标取得记录 fetch 游标名 into 变量名
e。关闭游标 close 游标名
其中ab已经说过了。剩下的步骤就是在过程体中完成了。
一般过程:
open 游标名
LOOP
fetch 游标名 into 变量名
END LOOP
close 游标名
这个过程有些繁琐。
用FOR循环之后就简单多了。
FOR FCRDATA IN 游标名 LOOP
END LOOP;
FOR循环可以不用显式的打开和关闭游标。FOR循环会自动执行这些。
4.EXCEPTION的捕捉。
EXCEPTION
WHEN NOWAITLOCKED THEN
OUT_PARAM03 := '2';
ROLLBACK;
RETURN;
WHEN OTHERS THEN
OUT_PARAM03 := '1';
ROLLBACK;
RETURN;
END;
当EXCEPTION发生的时候,就会跳转到这里。先判断是不是预定义的EXCEPTION。不是则用OTHERS来处理。
OTHERS可以处理所有的异常。必须在所有的特定异常之后。
5.调用过程
CALL 过程名(参数)
6.删除过程
DROP 过程名
7 获取过程的信息
SELECT * FROM USER_PROCEDURES