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

时间:2017-07-24 09:15:54

标签: sql ibm-midrange db2-400

简短说明: 在调用存储在不同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级别或任何其他配置参数

这个问题对你们任何人来说都很熟悉吗?

非常感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

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