oracle存储过程总结

1.oracle的存储过程一般用于处理某一个具体功能而产生的。在存储过程中方便的包含多个sql语句,还可以包括更复杂的游标,逻辑判断,向sql/plus输出你想要的信息等。总之存储过程很像java里面类中的方法。可以是无参,也可以有输入参数,输出参数。

存储过程的格式:

create or replace procedure 名称(arg1 in varchar2,arg out varchar2)  is

declare

声明变量

如:v_id int;

      v_str varchar2(40);

      v_empno emp.empno%type;

      v_emp  emp%rowtype;

      cursor Mycursor is slect * from emp;

begin

 具体的逻辑处理

end;

执行的时候:

在sql/plus中:exec 存储过程名;

1.例子:创建一个存储过程,接收一个编号,输出该员工的信息,如果没有信息提示找不到
CREATE OR REPLACE PROCEDURE myproc
 (p_empno emp.empno%type, p_emp out emp%rowtype)
IS 
BEGIN
 SELECT * INTO p_emp FROM emp WHERE empno = p_empno;
EXCEPTION
 WHEN NO_DATA_FOUND THEN
  DBMS_OUTPUT.PUT_LINE('找不到编号为' || p_empno || '的员工');
END;
/
执行
DECLARE
 v_emp emp%rowtype;
BEGIN
 myproc(7788, v_emp);
 DBMS_OUTPUT.PUT_LINE(v_emp.ename);
END;

2.例子:jd_sqd_fk_detail表包含用户支付审核单的保存信息,支付单号fk_zfdh对应多条审核记录,其中key_id最大的记录时最新的记录。用存储过程操作数据,找到有相同fk_zfdh的记录中最大的key_id,删除其余的[小于max(key_id)]的记录。

create or replace procedure DelNotMaxKey is
v_keyid int;
cursor Mycursor is select fk_zfdh from jd_sqd_fk_detail  group by fk_zfdh having count(*) >1;
item jd_sqd_fk_detail.fk_zfdh%type;
begin
 open Mycursor;
 loop
  exit when Mycursor %notfound;
fetch Mycursor  into item;
 select max(key_id) into v_keyid from jd_sqd_fk_detail where fk_zfdh=item;
 delete from  jd_sqd_fk_detail where fk_zfdh=item and key_id!=v_keyid;
end loop;
 close Mycursor;
end;
过程已创建。

SQL> exec  DelNotMaxKey();

PL/SQL 过程已成功完成。

总结:oracle存储过程很方便的去操作复杂的逻辑,达到简化操作,实现目的。可以说是比写sql操作数据来的方便简单。但是存储过程学习的难度还是比较高的,从简单的开始到复杂的,慢慢积累就会掌握什么时候用sql语句操作,什么时候用存储过程。总之sql语句写多了,你自然而然的想用存储过程去应对数据应用操作。

猜你喜欢

转载自nicegege.iteye.com/blog/1677013