我需要创建一个存储过程(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
答案 0 :(得分:1)
documentation中对此进行了说明。
要了解的关键详细信息是定位器,associate result set locators
,然后是allocate ... cursor for result set
。完成之后,您的调用过程可以像对待其他游标一样对待游标(获取行,关闭等)。
因此,如果您的嵌套过程返回1个结果集,则调用存储过程将声明locator,associate和被调用过程的结果集定位符,然后allocate指向游标消耗结果集。研究每个涉及语句的文档。
除上述内容外,如果您将始终过滤结果集,为什么不制作一个在源头执行过滤的过程(以避免缓慢的双重过滤)?您还可以让过程创建一个会话表,并使调用者访问该会话表。还是使用表函数返回所需的确切信息?