PL/SQL之存储过程处理

一.创建存储过程

在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调用:

PL/SQL之存储过程处理_第1张图片


二,存储过程调用

存储过程建立完成,我们得用,通过授权,用户能在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;

你可能感兴趣的:(procedure,exec,pragma,创建存储过程,authid)