一.创建存储过程
在ORACLE服务器上创建存储过程可以被多个程序调用,不仅可以传入参数,也可以传回参数。
存储过程创建语法:
--存储过程创建语法 CREATE [OR REPLACE] PROCEDURE procedure_name [(arg1 [IN|OUT|IN OUT] type1 [DEFAULT value1], arg2 [IN|OUT|IN OUT] type2 [DEFAULT value2], )]--特别注意,存储过程没有返回值 IS|AS --变量声明部分 BEGIN --执行部分 EXCEPTION --异常处理部分 END procedure_name;--创建存储过程结束
=============以下为实例==============
创建表,插入数据:
create table mytest( id number(3) PRIMARY KEY, name varchar2(20), age number(3) ); insert into mytest values(1,'one',18); insert into mytest values(2,'two',20); insert into mytest values(3,'three',24); commit;
简单存储过程创建:
CREATE OR REPLACE PROCEDURE pro_test IS BEGIN DBMS_OUTPUT.PUT_LINE('存储过程'); EXCEPTION WHEN OTHERS THEN DBMS_OUTPUT.PUT_LINE('抛异常'); END pro_test;删除个人信息综合使用:
CREATE OR REPLACE PROCEDURE pro_test(v_id mytest.id%TYPE) AS --非预定义异常 myexc EXCEPTION; BEGIN DELETE FROM mytest WHERE ID = v_id; --判断是否删除成功 IF SQL%NOTFOUND THEN RAISE myexc; END IF; EXCEPTION WHEN myexc THEN DBMS_OUTPUT.PUT_LINE('删除数据失败'); WHEN OTHERS THEN DBMS_OUTPUT.PUT_LINE('抛异常了'); END pro_test;在命令窗口中测试程序的正确性,正常用exec调用函数也行,正常使用exec调用:
二,存储过程调用
存储过程建立完成,我们得用,通过授权,用户能在sqlplus,oracle第三方工具,第三方工具中调用运行。
传参方式与函数一样,位置,名称,组合。
在ORALCE中使用EXEC或EXECUTE调用存储过程:
EXEC[UTE] procedure_name[(value1,value2,....)];
例如:EXEC pro_test(1);
三,AUTHID
AUTHID可以告诉ORACLE,存储过程属于谁的权限运行,默认情况下,作为调用者的过程运行,但是具有设计者特权。
使用AUTHID DEFINER创建存储过程:
CREATE OR REPLACE PROCEDURE pro_test AUTHID DEFINER IS BEGIN DBMS_OUTPUT.PUT_LINE('存储过程'); EXCEPTION WHEN OTHERS THEN DBMS_OUTPUT.PUT_LINE('抛异常'); END pro_test; GRANT EXECUTE ON pro_test TO PUBLIC;对相应用户进行过程权限的管理。
四,PRAGMA AUTONOMOUS_TRANSACTION,建立独立事务不受父事务干扰存储过程
CREATE OR REPLACE PROCEDURE pro_test(v_id mytest.id%TYPE) AS PRAGMA AUTONOMOUS_TRANSACTION; --非预定义异常 myexc EXCEPTION; BEGIN DELETE FROM mytest WHERE ID = v_id; COMMIT; --判断是否删除成功 IF SQL%NOTFOUND THEN RAISE myexc; END IF; EXCEPTION WHEN myexc THEN DBMS_OUTPUT.PUT_LINE('删除数据失败'); WHEN OTHERS THEN DBMS_OUTPUT.PUT_LINE('抛异常了'); END pro_test;测试:
DECLARE BEGIN DELETE FROM mytest WHERE id = 2; --存储过程调用 pro_test(3);--第三条数据删除,父事物的回滚,无法影响子事务设计的提交 ROLLBACK;--目的想让删除的数据回滚 END;
五,删除存储过程
drop procedure [user.]procedure_name;