Как вернуть несколько наборов данных из внешней хранимой процедуры - PullRequest
0 голосов
/ 03 августа 2020

Я использую клиентские решения 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;       

                                           

Это кажется довольно простым - любая помощь будет принята с благодарностью .

Майк

...