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语句写多了,你自然而然的想用存储过程去应对数据应用操作。