iSeries:从调用另一个 iSeries 系统上的存储过程的 RPG 程序获取 SQL 结果集时出错

问题描述 投票:0回答:2

简短描述: 调用存储在不同 iSeries 中的 SQL 过程后,我尝试使用关联的游标访问结果集,但 fetch 语句会导致 MCH3601“指针未设置为引用的位置”错误。

详情: SQLRPGLE 程序执行以下 D 和 C 规范来调用在不同 iSeries 上运行的 SQL 存储过程并返回具有单个字段的单个行:

** Locator definition
D OUTPIK          S                   SQLTYPE(RESULT_SET_LOCATOR)    
** Resultset definition as the thirdy-part developer told us it is
D DSPIK           DS                  OCCURS(1)         
D  FLPIK                         1A                     

// Connecting to a second iSeries
EXEC SQL 
  CONNECT TO :wrkDBR  USER :wrkUSER USING :wrkPWD;

// Calling stored procedure
EXEC SQL 
  CALL LOGF10OPIN/DEDALO_SIRE_POSTOPICKING (:CAZI_S, :CEDI_S, :CART_S);

// Associating SQL locator to SP resultset
EXEC SQL 
  ASSOCIATE RESULT SET LOCATORS (:OUTPIK) 
    WITH PROCEDURE LOGF10OPIN/DEDALO_SIRE_POSTOPICKING;

// Allocating result set to a cursor
EXEC SQL 
  ALLOCATE CPI CURSOR FOR RESULT SET :OUTPIK;

// Fetching resul set into a variable defined as CHAR(1) 
EXEC SQL 
  fetch CPI into :DSPIK;

// Closing cursor
EXEC SQL 
  CLOSE CPI;

// Disconnecting
EXEC SQL 
  DISCONNECT :wrkDBR;

假设通过 SQLCA 变量检查每个 SQL 语句的执行,会发生的情况是 fetch 语句会导致“MCH3601 - POINTER NOT SET FOR LOCATION REFERENCED”,就好像它无法访问结果集的内存位置一样。

进一步调查: 从存储 SP 的同一系统上的 SQL 客户端(IBM 或 DBeaver)运行以下语句,返回正确的值(例如“N”)

CALL LOGF10OPIN.DEDALO_SIRE_POSTOPICKING ('A01', '00M1', '0000123');

但是当我使用 iSeries 中的以下语句进行相同的调用时,我需要从中调用 SP,结果出乎意料

CONNECT TO B0050C2B  USER RETAIL USING 'xxx';
CALL LOGF10OPIN.DEDALO_SIRE_POSTOPICKING ('A01', '00M1', '0000123');
DISCONNECT B0050C2B;

我在 FTP 客户端上看到的答案是值“D5”,它是“N”的 EBCDIC 十六进制值!

最终考虑因素:
- 发出调用的不同 SQL 客户端(包括与第二个 iSeries 的连接)返回不同的值:预期值的 EBCDIC 十六进制值(IBM SQL 客户端)或什至更低的“a”(DBeaver)
- 我无法访问保存并运行 SP 的 iSeries,因此我无法检查两个系统是否处于相同的 PTF 级别或任何其他配置参数

这个问题你们有没有觉得很熟悉?

非常感谢您的帮助。

sql ibm-midrange db2-400
2个回答
0
投票

看来这个问题需要IBM的PTF才能在V7R1和V7R2上解决。


0
投票

您可以尝试为 DSPIK 使用“Qualified Dim(1)”而不是“OCCURS(1)” 参考:https://www.itjungle.com/2010/08/25/fhg082510-story02/

所以,这条线,

D DSPIK           DS                  OCCURS(1)         

成为,

D DSPIK           DS                  Qualified Dim(1)         
© www.soinside.com 2019 - 2024. All rights reserved.