当前位置: 首页 > 知识库问答 >
问题:

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

葛承嗣
2023-03-14

简短说明:在调用了存储在不同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;

进一步研究:以下语句从存储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十六进制值!

非常感谢你的帮助。

共有1个答案

慕凡
2023-03-14

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

 类似资料:
  • 问题内容: 我有一个MYSQL存储过程SP1(),它返回一个结果集。 我想在SP2()内部调用SP1()并遍历SP1()的结果集以执行一些其他工作。 我不想从SP1()中包含我的逻辑,因为这会使SP2()过于复杂。 有什么建议么? 谢谢。 问题答案: 您想做的事情听起来并不是特别好,也许您应该考虑重新设计这两个过程。但是,您可以执行以下操作来快速解决此问题: 使您的sp2 sproc将其中间结果写

  • 问题内容: 我有一个需要很多参数的插入存储过程-其中2个是@ FirstName,@ LastName。我还有一个更新存储过程,该过程需要许多参数-其中2个是@ FirstName,@ LastName。 我想做的是,从插入SP内部完成之后,调用更新SP并将其发送给@ FirstName,@ LastName。 我不知道这样做的正确语法;我试过了: 但我认为这是错误的。 有人可以告诉我怎么写这个电

  • 问题内容: 我并不是说要进行“ SET NOCOUNT OFF”。但是我有一个存储过程,可用于将一些数据插入某些表中。此过程创建一个xml响应字符串,下面让我举一个例子: 因此,我整理了一个脚本,该脚本多次使用此SP,并且xml“输出”变得太多了(它已经使我的盒子崩溃了)。 有没有办法抑制或重定向由此存储过程生成的输出?我不认为修改此存储过程是一种选择。 谢谢。 我想我应该澄清一下。上面的SP被我

  • 问题内容: 我正在编写一个存储过程,需要在该过程中动态构造一个SQL语句以引用传入的表名。 我需要让该SQL语句返回结果,然后可以在整个过程的其余部分中使用它。 我已经尝试过使用临时表和其他所有东西,但是我不断收到一条消息,我需要声明变量等。 例如: 或者… 无论如何,有没有这样做而不使用实际表? 谢谢。 问题答案: 您是否尝试过类似的方法: 您需要确保将nvarchar字符串加N作为前缀,例如。

  • 我如何在服务器的另一个存储过程中执行SQL存储过程?我将如何传递第二个过程的参数。?

  • 问题内容: 有谁知道从存储过程结果集中创建表定义的方法? 我有一个存储过程,该过程产生具有30多个列的结果集,我想将其放入表中而不必手动创建所有表列。 是否有内置的过程将转储列名和类型..? 谢谢。 问题答案: 您可以“做到”,但是我不知道是否推荐这样做: