简短描述: 调用存储在不同 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 级别或任何其他配置参数
这个问题你们有没有觉得很熟悉?
非常感谢您的帮助。
看来这个问题需要IBM的PTF才能在V7R1和V7R2上解决。
您可以尝试为 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)