DB2存储过程(游标+循环)
理论部分
–游标
–定义游标:DECLARE 游标名 CURSOR FOR SELECT 语句
在 SQL 过程中,游标除了迭代结果集中的⾏,还可以将结果集返回给调⽤程序或其他过程
·WITHOUT RETURN/WITH return:选项指定游标的结果表是否⽤于作为从⼀个过程中返回的结果集。
·WITH RETURN TO CALLER:选项指定将来⾃游标的结果集返回给调⽤者,后者可以是另⼀个过程或⼀个客户机应⽤程序。这是默认选项。
·WITH RETURN TO CLIENT:选项指定将来⾃游标的结果集返回给客户机应⽤程序,绕过任何中间的嵌套过程。
illusion
–下⾯是游标声明的⼏个例⼦:
1.DECLARE c1 CURSOR FOR lect * from staff; --(DECLARE关键字,cl游标名称,CURSOR是必
须有的,指通过c1的游标来操作staff⾥所有的数据)最常⽤的最普通的。
2.DECLARE c1 CURSOR WITH HOLD FOR lect * form staff; --如果不加with hold则此游标遇到commit或者rollback语句会⾃动关闭。加上了with hold 则必须⽤clo关闭。
3.DECLARE c1 CURSOR WITH RETURN TO CALLER FOR lect * form staff;
4.DECLARE c1 CURSOR WITH RETURN TO CLIENT FOR lect * form staff;
若要从⼀个过程中返回结果集,需要:
soft一公升的眼泪主题曲·创建⼀个过程,创建时指定 DYNAMIC RESULT SETS ⼦句中声明存储过程将要返回结果集的数量。
toss·声明游标,声明时指定 WITH RETURN ⼦句。
·打开该游标,并使之保持 open 状态,如果关闭该游标,则结果集将不能返回给调⽤者应⽤程序。
–返回⼀个结果集的游标的声明
CREATE PROCEDURE emp_from_dept() DYNAMIC RESULT SETS 1 --返回的结果集超出定义的数量会返回⼀个警告
P1: BEGIN
DECLARE c_emp_dept CURSOR WITH RETURN
FOR SELECT empno, lastname, job, salary, comm. FROM employee WHERE workdept = ‘E21’;
OPEN c_emp_dept;
END P1
存储过程实例
–游标+循环
CREATE OR REPLACE PROCEDURE “PAS”.“SP_PASCALC_TEST” (
IN “I_TJRQ” INTEGER,
OUT “I_ERR_NO” INTEGER )
begin
declare sqlcode integer default 0; --错误代码
declare i_at_end integer default 0; --查询结果是否找到变量
declare i_code integer default 0; --错误代号
declare v_err_msg varchar(1024); --错误描述
–声明变量(程序中⽤到的所有的变量都要声明,此处举例声明变量不全)
declare v_proc_name varchar(30) default ‘SP_PASCALC_TEST’; --程序名称
declare v_sql varchar(10000) default ‘’;–动态sql
declare v_proc_sjms varchar(100); --⽇志描述
declare v_appid varchar(20); --appid
declare v_lysql varchar(8000); --来源SQL
declare v_mbbm varchar(40); --⽬标表名
declare v_mbbzdl varchar(4000); --⽬标表字段列
declare i_count integer; --⽤于记数
declare v_cur_str varchar(8000) default ‘’;–组成游标的sql
–定义游标的⽅式有多种,此处说明两种常⽤的⽅式(第⼀种)
declare cur_dd cursor with hold for lect appid,bm,htccsql from jsc_appcshpz;
fruits
–异常声明
declare exit handler for sqlexception
begin
t i_code=sqlcode;
t i_err_no=1;
–此处记录出错⽇志…
commit;
end;
–声明查询结果是否找到(没有数据后赋值为1)
百度翻译在线翻译英文
declare continue handler for not found
begin
t i_at_end = 1;
end;
—程序开始
t i_err_no = 0;
—写⽇志
mountainliont v_proc_sjms=rtrim(char(i_tjrq))||‘XXX程序开始’;
call SP_PASSYS_XTRZ (‘0’,v_proc_name,v_proc_sjms);
–通过以下⽅式可以赋值
–多个值
lect sym,sjm,snm,ym,jm,nm,sr,sntq,nc,jc,yc into i_sym,i_sjm,i_snm,i_ym,i_jm,i_nm,i_sr,i_sntq,i_nc,i_jc,i_yc from csb_sjw where tjrq=i_tjrq;
–⼀个值
lect yc into i_syc from csb_sjw where tjrq=i_sym;
–直接赋值
t i_sbnrqnf=int(substr(char(i_sbnrq),1,4));
–t i_at_end=0;
–打开游标
open cur_dd;
–把游标⾥的数据赋值给变量
fetch cur_dd into v_appid,v_mbbm,v_lysql;
t i_at_end=0;
call SP_PASSYS_XTRZ (‘0’,v_proc_name,‘循环开始’);
while(i_at_end = 0) do
begin
–进⾏数据处理
call SP_PASSYS_XTRZ (‘0’,v_proc_name,‘appid:’||char(v_appid)||‘循环开始1’);
listen是什么意思call SP_PASSYS_XTRZ (‘0’,v_proc_name,‘appid:’||char(v_appid)||’ 数据处理过程完成’);
–数据处理结束
easy是什么意思t i_at_end=0;
fetch cur_dd into v_appid,v_mbbm,v_lysql;
call SP_PASSYS_XTRZ (‘0’,v_proc_name,‘appid:’||char(v_appid)||‘循环开始0’);thought是什么意思
end;
end while;
–关闭游标
clo cur_dd;
t v_proc_sjms = rtrim(char(i_tjrq))||‘⼯资核对绩效结果初始化结束’;
call SP_PASSYS_XTRZ (‘0’,v_proc_name,v_proc_sjms);
commit;
end