Я использую клиентские решения Access для тестирования хранимой процедуры SQL на IBM i. Хранимая процедура имеет два вызова других ВНЕШНИХ хранимых процедур, которые вызывают программы RPGSQLE, каждая из которых возвращает набор данных КЛИЕНТУ выбранных данных. Если я использую SQL для возврата данных, я могу получить два возвращенных набора данных, но поскольку мне нужно выполнить другую обработку, я использую программы SQLRPGLE для выбора, обновления и возврата данных. В моем тестировании я могу получить только один набор данных за раз - второй. Я могу получить первый, если закомментирую второй звонок. Я попытался увеличить количество возвращаемых наборов данных, просто чтобы проверить, не возникла ли проблема с этим, но получить те же результаты.
Примечание. Обе программы SQLRPGLE создают глобальную временную таблицу, содержащую данные, которые будут будет возвращен в наборе данных.
CREATE PROCEDURE SP_PROC
( IN STORE DEC(3,0) )
DYNAMIC RESULT SETS 2
LANGUAGE SQL
MODIFIES SQL DATA
CALLED ON NULL INPUT
BEGIN
CALL SP_PGM01(STORE);
CALL SP_PGM02(STORE);
END
PGM01:
CREATE PROCEDURE SP_PGM01
( IN STORE DEC(3,0) )
DYNAMIC RESULT SETS 1
LANGUAGE RPGLE
MODIFIES SQL DATA
CALLED ON NULL INPUT
EXTERNAL NAME PGM01
PARAMETER STYLE GENERAL ;
... (PGM01 SQLRPGLE additional processing not shown)
SqlStmt = 'Select * from session.SKUS +
ORDER BY T1SKU, T1TypeA, T1TypeB, T1TypeC' ;
Exec Sql Prepare s1 From :SqlStmt;
Exec Sql Declare C1_SKU Cursor WITH RETURN TO CLIENT For s1;
Exec Sql Open C1_SKU;
Exec Sql SET RESULT sets WITH RETURN TO CLIENT cursor C1_SKU;
*INLR = *On;
Return;
PGM02:
CREATE PROCEDURE SP_PGM02
( IN STORE DEC(3,0) )
DYNAMIC RESULT SETS 1
LANGUAGE RPGLE
MODIFIES SQL DATA
CALLED ON NULL INPUT
EXTERNAL NAME PGM02
PARAMETER STYLE GENERAL ;
... (PGM02 SQLRGPLE additional processing not shown)
SqlStmt = 'Select * from session.UPCS +
ORDER BY T2UPC, T2SKU' ;
Exec Sql Prepare s2 From :SqlStmt;
Exec Sql Declare C1_UPC Cursor WITH RETURN TO CLIENT for s2;
Exec Sql Open C1_UPC;
Exec Sql SET RESULT sets WITH RETURN TO CLIENT cursor C1_UPC;
*INLR = *On;
Return;
Это кажется довольно простым - любая помощь будет принята с благодарностью .
Майк