Как управлять набором результатов, возвращаемых хранимой процедурой, вызываемой внутри хранимой процедуры в DB2 - PullRequest
1 голос
/ 03 апреля 2019

Мне нужно создать хранимую процедуру (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 Ответ

1 голос
/ 03 апреля 2019

Это описано в документации .

. Ключевыми деталями, которые необходимо узнать, являются локаторы, associate result set locators, а затем allocate ... cursor for result set.После того, как это сделано, ваша вызывающая процедура может обрабатывать курсор так же, как и любой другой (выборка строк, закрытие и т. Д.).

Так что, если ваши вложенные процедуры возвращают 1 набор результатов, вызывающий sproc объявит локатор , связывает локатор набора результатов с вашей вызываемой процедурой, затем выделяет курсор для использования набора результатов.Изучите документацию для каждого из задействованных операторов.

Помимо вышесказанного, если вы всегда будете фильтровать набор результатов, почему бы не создать процедуру, которая выполняет фильтрацию в источнике (чтобы избежать медленной двойной фильтрации)?Вы также можете создать процедуру для создания сеансовой таблицы и предоставить вызывающим абонентам доступ к этой сеансовой таблице.Или использовать табличную функцию, чтобы вернуть именно то, что нужно?

...