DB2存储过程调用另外存储过程的结果集

下面我们通过一个例子来详细讲解如何实现这个功能。

首先我们创建一个能够返回结果集的存储过程,然后我们再构建一个能够使用这个存储过程返回的结果集的存储过程。

例子中我们使用SAMPLE数据库。存储过程rsA 定义了两个游标用于返回结果集,

cur1返回薪水大于输入值的所有记录,cur2返回薪水小于等于输入值的所有记录。

CREATE PROCEDURE rsA (IN sal decimal(10,2) )
RESULT SETS 2
LANGUAGE SQL
P1: BEGIN
DECLARE cur1 CURSOR WITH RETURN TO CALLER
FOR SELECT
EMPLOYEE.EMPNO AS EMPNO,
EMPLOYEE.SALARY AS SALARY
FROM
EMPLOYEE
WHERE salary > sal;
DECLARE cur2 CURSOR WITH RETURN TO CALLER
FOR SELECT
EMPLOYEE.EMPNO AS EMPNO,
EMPLOYEE.SALARY AS SALARY
FROM
EMPLOYEE
WHERE salary <= sal; 
OPEN cur1;
OPEN cur2;
END P1@ 

存储过程usecur 调用存储过程rsA,接收rsA返回的两个结果集的数据,然后对薪水进行求和并输出。

CREATE PROCEDURE usecur( out sum1 decimal(10,2),out sum2 decimal(10,2))
LANGUAGE SQL
BEGIN
DECLARE sqlcode int DEFAULT 0;
DECLARE v_salary decimal(10,2); 
DECLARE v_empno char(6);
DECLARE v_lim decimal(10,2); 
DECLARE LOC1 RESULT_SET_LOCATOR VARYING;
DECLARE LOC2 RESULT_SET_LOCATOR VARYING;
SET sum1 = 0;
SET sum2 = 0;
SET v_lim = 25000;
--调用存储过程
CALL rsA(v_lim);

--将结果集定位器和调用的存储过程联系起来
ASSOCIATE RESULT SET LOCATOR( LOC1,LOC2) WITH 
PROCEDURE rsA;
--为结果集定位器分配游标
ALLOCATE C1 CURSOR FOR RESULT SET LOC1;
ALLOCATE C2 CURSOR FOR RESULT SET LOC2;
--从游标中获取数据
FETCH FROM C1 INTO v_empno, v_salary; 
WHILE sqlcode = 0
DO
SET sum1 = sum1 + v_salary; 
FETCH FROM C1 INTO v_empno, v_salary; 
END WHILE; 
--从游标中获取数据
FETCH FROM C2 INTO v_empno, v_salary; 
WHILE sqlcode = 0
DO
SET sum2 = sum2 + v_salary; 
FETCH FROM C1 INTO v_empno, v_salary; 
END WHILE; 
END@

下面我们看一下运行结果:
D:/Temp/sp>db2 "call rsa(25000)"


结果集 1
--------------

EMPNO SALARY
------ -----------
000010 52750.00
000020 41250.00
000030 38250.00
000050 40175.00
000060 32250.00
000070 36170.00
000090 29750.00
000100 26150.00
000110 46500.00
000120 29250.00
000140 28420.00
000150 25280.00
000200 27740.00
000220 29840.00
000240 28760.00
000270 27380.00
000280 26250.00
000330 25370.00

18 条记录已选择。


结果集 2
--------------

EMPNO SALARY
------ -----------
000130 23800.00
000160 22250.00
000170 24680.00
000180 21340.00
000190 20450.00
000210 18270.00
000230 22180.00
000250 19180.00
000260 17250.00
000290 15340.00
000300 17750.00
000310 15900.00
000320 19950.00
000340 23840.00

14 条记录已选择。

返回状态 = 0


D:/Temp/sp>db2 "call usecur(?,?)"

输出参数的值
--------------------------
参数名: SUM1
参数值: 591535.00

参数名: SUM2
参数值: 23800.00

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值