如何处理由DB2中的存储过程内部调用的存储过程返回的结果集

时间:2019-04-03 03:39:16

标签: sql stored-procedures db2 resultset

我需要创建一个存储过程(SP_CALLER),该存储过程将调用另一个存储过程(SP_CALLED)并选择其返回的结果集。

我们如何查询返回的结果集?

CREATE OR REPLACE PROCEDURE SCHEMANAME.SP_CALLER(@PARAM1 INT, @PARAM2 VARCHAR)
DYNAMIC RESULT SETS 1

P1:BEGIN

DECLARE VALUE1 INT DEFAULT 0;
DECLARE VALUE2 VARCHAR DEFAULT 'TEST';

CALL SCHEMANAME.SP_CALLED @XPARAM1=VALUE1, @XPARAM2=VALUE2; --<-- returns a result set

SELECT * 
INTO #TEMPTABLE
FROM (resultsetquery); --<-- from the returned result set of sp_called



SELECT *
FROM #TEMPTABLE a, 
SCHEMANAME.TABLE2 b
WHERE a.COL1 = @PARAM1 AND b.COL2 = @PARAM2;



END P1

更新04/04/2019:

该文档确实很有帮助,但是我被困在这里..如何查询分配给该变量('cur')的结果集并将其作为存储过程的新结果集(SCHEMANAME.SP_CALLER)返回? ??

CREATE OR REPLACE PROCEDURE SCHEMANAME.SP_CALLER() DYNAMIC RESULT SETS 1

P1:BEGIN

DECLARE loc_cursor RESULT_SET_LOCATOR VARYING;


CALL SCHEMANAME.SPNAME();

ASSOCIATE RESULT SET LOCATOR (loc_cursor) WITH PROCEDURE SCHEMANAME.SPNAME; 
ALLOCATE cur CURSOR FOR RESULT SET loc_cursor;


CLOSE cur;

END P1

1 个答案:

答案 0 :(得分:1)

documentation中对此进行了说明。

要了解的关键详细信息是定位器,associate result set locators,然后是allocate ... cursor for result set。完成之后,您的调用过程可以像对待其他游标一样对待游标(获取行,关闭等)。

因此,如果您的嵌套过程返回1个结果集,则调用存储过程将声明locatorassociate和被调用过程的结果集定位符,然后allocate指向游标消耗结果集。研究每个涉及语句的文档。

除上述内容外,如果您将始终过滤结果集,为什么不制作一个在源头执行过滤的过程(以避免缓慢的双重过滤)?您还可以让过程创建一个会话表,并使调用者访问该会话表。还是使用表函数返回所需的确切信息?