无法从 sqlrpgle SQL 查询中获取数据

Unable to fetch data from an sqlrpgle SQL query

我正在尝试 运行 在我的 RPG 程序中进行 SQL 查询,但是我无法将结果提取到我的变量(数据结构)中。

这是我迄今为止尝试过的代码。

Dsassure          DS                  QUALIFIED
Dasnste                          1a            
Dasngrp                          4s 0          
Dasnind                          5s 0          
Dasnra3                          1s 0          
Dasnnss                         13a            
Dasncss                          2s 0          
Dasnreg                          2s 0          
Dasnorg                          3s 0          
Dasncen                          3s 0          
Dasnclo                          1s 0          
Dasnpmu                          1a            
Dasnnoa                         25a            
Dasnpra                         15a  
Dasnnob                         25a  
Dasnprb                         15a  
Dasnnas                          2s 0
Dasnnaa                          2s 0
Dasnnam                          2s 0
Dasnnaj                          2s 0
Dasnrng                          1s 0
Dasnefs                          2s 0
Dasnefa                          2s 0
Dasnefm                          2s 0
Dasnefj                          2s 0
Dasnras                          2s 0
Dasnraa                          2s 0
Dasnram                          2s 0
Dasnraj                          2s 0
Dasnctn                          1a  
Dasnnmu                          8s 0
Dasnst3                          3a  

 //*-----------------------------------------------------------------  
C     *ENTRY        PLIST                                                
C                   PARM                    x1secu           13          
C                   PARM                    x1reg             2 0        
C                   PARM                    x1caisse          3          
C                   PARM                    x1datea           2 0        
C                   PARM                    x1datem           2 0        
C                   PARM                    x1datej           2 0                
C/exec sql                  
C+ set option commit=*none, 
C+ datfmt=*iso              
C/end-exec                  
 *                                                                                     
 /Free                                                                                 
                                                                                       
   //*-----------------------------------------------------------------
     exec sql                                                                          
         DECLARE c1 CURSOR FOR                                                         
                 SELECT asste,  asgrp,  asind,                                         
                        asran3, assecu, asscle,                                        
                        asnom,  aspre,  asnom,                                         
                        aspre,  asnais, asnaia,                                        
                        asnaim, asnaij, asrsec,                                        
                        aseffs, aseffa, aseffm,                                        
                        aseffj, asrads, asrada,                                        
                        asradm, asradj, asctns                                         
                                                                                       
         FROM QPURGE.SASSURE                                                           
         WHERE ASSECU = :x1secu;

    exec sql                                                           
        OPEN c1;                                                       
                                                                   
If   SQLSTATE = '00000';                                           
                                                                   
    exec sql                                                       
        FETCH c1 INTO                                    
                 :sassure.asnste, :sassure.asngrp, :sassure.asnind,
                 :sassure.asnra3, :sassure.asnnss, :sassure.asncss,
                 :sassure.asnraj, :sassure.asnnoa, :sassure.asnpra,
                 :sassure.asnnob, :sassure.asnprb, :sassure.asnnas,
                 :sassure.asnnaa, :sassure.asnnam, :sassure.asnnaj,
                 :sassure.asnrng, :sassure.asnefs, :sassure.asnefa,
                 :sassure.asnefm, :sassure.asnefj, :sassure.asnras,
                 :sassure.asnraa, :sassure.asnram, :sassure.asnctn;

    exec sql   
       CLOSE c1;

我尝试使用数据结构作为 INTO 目标,但没有成功。

FETCH c1 INTO :sassure;

我也试过不用光标,指定子字段

VALUES (SELECT asste,  asgrp,  asind,                          
               asran3, assecu, asscle,                         
               asnom,  aspre,  asnom,                          
               aspre,  asnais, asnaia,                         
               asnaim, asnaij, asrsec,                         
               aseffs, aseffa, aseffm,                         
               aseffj, asrads, asrada,                         
               asradm, asradj, asctns                          
                                                               
FROM QPURGE.SASSURE                                            
WHERE ASSECU = :x1secu) INTO                                   
             :sassure.asnste, :sassure.asngrp, :sassure.asnind,
             :sassure.asnra3, :sassure.asnnss, :sassure.asncss,
             :sassure.asnraj, :sassure.asnnoa, :sassure.asnpra,
             :sassure.asnnob, :sassure.asnprb, :sassure.asnnas,
             :sassure.asnnaa, :sassure.asnnam, :sassure.asnnaj,
             :sassure.asnrng, :sassure.asnefs, :sassure.asnefa,
             :sassure.asnefm, :sassure.asnefj, :sassure.asnras,
             :sassure.asnraa, :sassure.asnram, :sassure.asnctn;

似乎没有任何效果,我使用调试器获取了一个样本,看看我的请求是否符合我的要求 returns 并且确实如此。

我真的对这个没想法..

有什么想法吗?

请注意,您可以在此处使用 SELECT INTO 而不是 VALUES INTO,因为您使用的是静态 SQL 而不是动态 SQL。

无论哪种情况,请注意 select 语句的结果必须 return 一行。否则你会得到一个 SQLSTATE=21000(如果我没记错的话)。如果你需要 rad 多行,你必须使用游标。

您必须在 运行 嵌入 SQL 后检查 SQLSTATE(或 SQLCODE)。

SQLSTATE --> description
'00000' --> unqualified success
'01xxx' --> successful with warnings
'02000' --> no data

您应该能够使用游标中的数据结构作为 SELECT INTO VALUES INTOFETCH 的 return 变量。

SELECT asste,  asgrp,  asind,                          
       asran3, assecu, asscle,                         
       asnom,  aspre,  asnom,                          
       aspre,  asnais, asnaia,                         
       asnaim, asnaij, asrsec,                         
       aseffs, aseffa, aseffm,                         
       aseffj, asrads, asrada,                         
       asradm, asradj, asctns                          
INTO :sassure                                                               
FROM QPURGE.SASSURE                                            
WHERE ASSECU = :x1secu;

请注意,如果任何值可能为 NULL,则您需要一个带有 DIM(24) 的指示器数组,以便每个 returned 列都有一个空指示器标志。