【问题标题】:Unable to fetch data from an sqlrpgle SQL query无法从 sqlrpgle SQL 查询中获取数据
【发布时间】:2021-06-28 09:19:13
【问题描述】:

我正在尝试在我的 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;

似乎没有任何效果,我使用调试器获取了一个示例,看看我的请求是否返回了任何东西,并且确实如此。

我真的没有这个想法..

有什么想法吗?

【问题讨论】:

  • FETCH 后 SQLCODE/SQLSTATE 的值是多少?
  • 我先尝试了如何做,获取光标并指定子字段。 SQLCODE = -420, SQLSTATE = 22018
  • 好吧,我发现了我的错误。我在 INTO 子句中放错了 :sassure.asnraj。它在自己之后移动了所有目标子字段..

标签: sql db2 ibm-midrange rpgle


【解决方案1】:

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

在任何一种情况下,请注意 select 语句的结果必须返回单行。否则你会得到一个 SQLSTATE=21000 (如果我没记错的话)。如果您需要绘制多行,则必须使用光标。

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

SQLSTATE --> 描述
'00000' --> 不合格的成功
'01xxx' --> 成功但有警告
'02000' --> 没有数据

您应该能够将数据结构用作来自游标的SELECT INTO VALUES INTOFETCH 的返回变量。

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) 的指示符数组,以便每个返回的列都有一个可用的空指示符标志。

【讨论】:

    猜你喜欢
    • 2019-02-06
    • 1970-01-01
    • 1970-01-01
    • 2019-09-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-14
    相关资源
    最近更新 更多