Ibm midrange 使用RPG变量作为游标名执行SQL语句

Ibm midrange 使用RPG变量作为游标名执行SQL语句,ibm-midrange,rpgle,rpg,Ibm Midrange,Rpgle,Rpg,我想将游标和数据结构传递给一个过程,然后该过程用sql游标的下一行填充该结构。这可能吗?下面是我试图实现的目标的模板 ***************************************************** * * Fetch the next row from a cursor * * @param cursor - the name of the cursor * @param structure - the data structure to ho

我想将游标和数据结构传递给一个过程,然后该过程用sql游标的下一行填充该结构。这可能吗?下面是我试图实现的目标的模板

  *****************************************************
  *
  * Fetch the next row from a cursor
  *
  * @param cursor - the name of the cursor
  * @param structure - the data structure to hold the fields
  *****************************************************
 pfetchNextRow     B
 DfetchNextRow     PI              N
 d cursor                     32767A   varying const
 d structure       DS                  ???????               
  /free 
     exec sql
       fetch next from :cursor  into :structure 
     ;

     if (sqlstate = SQL_SUCCESS);
       return *on;
     else;
       exec sql
         close :cursor;
       return *off;
     endif;

  /end-free
 pfetchNextRow     E

我应该如何传递光标,以及如何定义数据结构参数?

我不确定您是否可以动态定义光标。一个问这个问题的好地方是在电视上。该列表中有RPG编译器团队的成员经常回答这样的问题。

我不确定您是否可以动态定义游标。一个问这个问题的好地方是在电视上。列表中有RPG编译器团队的成员经常回答类似的问题。

我不知道您是否在其他网站上收到了答案,但其他人可能需要它

游标“全局”存在,但仅在声明它们的模块中存在,您无需将其传递到此模块中的过程,您声明的游标在关闭或作业结束之前始终可用

您可以这样做(仅当您在同一模块中时):

这两个过程使用相同的光标“mC”,并且位于同一模块中。 第一个准备、声明并打开游标,第二个获取RowMC中的行

正如您所看到的,用于获取的DS是基于空指示符数组的

所有Like和LikeDS参数都在副本文件中定义为模板,如:

 D comfraf       e DS                  extname(comfra00f) QUALIFIED TEMPLATE
 D dsSql_0         DS                  Qualified  TEMPLATE
 D  cid                                like(comfraf.cid      )            
 D  ccap                               like(comfraf.ccap     )            

 D sqlNI_0         s              5I 0 TEMPLATE 

希望这能帮助别人。

我不知道你是否在其他网站上收到了答案,但其他人可能需要它

游标“全局”存在,但仅在声明它们的模块中存在,您无需将其传递到此模块中的过程,您声明的游标在关闭或作业结束之前始终可用

您可以这样做(仅当您在同一模块中时):

这两个过程使用相同的光标“mC”,并且位于同一模块中。 第一个准备、声明并打开游标,第二个获取RowMC中的行

正如您所看到的,用于获取的DS是基于空指示符数组的

所有Like和LikeDS参数都在副本文件中定义为模板,如:

 D comfraf       e DS                  extname(comfra00f) QUALIFIED TEMPLATE
 D dsSql_0         DS                  Qualified  TEMPLATE
 D  cid                                like(comfraf.cid      )            
 D  ccap                               like(comfraf.ccap     )            

 D sqlNI_0         s              5I 0 TEMPLATE 

希望这能帮助别人。

谢谢,我向他们注册了谢谢,我向他们注册了,只是想快速指出这个答案中的错误。用于提取的DS(
Rowmc
)不基于
Rowmc_b
是基于的,直接位于
Rowmc
之上。使用“基于”是一种预模板技术,可以定义什么本质上是一个模板,只要您从不以任何内容为基础。在您的示例中,
Rowmc_b
pNull1
是不必要的。同样的评论也适用于空指示器阵列(
NullImc
)及其周围的结构。谢谢@jmarkmurphy,正如你看到的2011年的答案一样,桥下已经有一滴水飞了!!!谢谢你指出,你真的是对的。目前我还没有办法测试一个新的更新答案,这里发布的答案仍然有效,但有点多余,希望有办法编写和测试一个新的答案。非常感谢。因为基于的答案只是一个误解,我的意思是获取所指的变量是基于/模板化的(基于是6.1之前定义模板的方法之一)。对于“Rowmc_b”和“pNull1”,可能是copy和pass旧变量。只想快速指出这个答案中的错误。用于提取的DS(
Rowmc
)不基于
Rowmc_b
是基于的,直接位于
Rowmc
之上。使用“基于”是一种预模板技术,可以定义什么本质上是一个模板,只要您从不以任何内容为基础。在您的示例中,
Rowmc_b
pNull1
是不必要的。同样的评论也适用于空指示器阵列(
NullImc
)及其周围的结构。谢谢@jmarkmurphy,正如你看到的2011年的答案一样,桥下已经有一滴水飞了!!!谢谢你指出,你真的是对的。目前我还没有办法测试一个新的更新答案,这里发布的答案仍然有效,但有点多余,希望有办法编写和测试一个新的答案。非常感谢。因为基于的答案只是一个误解,我的意思是获取所指的变量是基于/模板化的(基于是6.1之前定义模板的方法之一)。对于“Rowmc_b”和“pNull1”,右边可能是copy和pass旧变量。