0

是否有一种方法可以对未硬编码的参数进行编程?

在这个问题/片段中代替 :SomeValue 主机变量:

    EXEC SQL                                                      

     FETCH NEXT ROWSET FROM C_NJSRD2_cursor_declared_and_opened                        
     FOR :SomeValue ROWS                                            
     INTO                                                   

             :NJCT0022.SL_ISO2         :NJMT0022.iSL_ISO2   
     etc....

这里有一些澄清:

如果我将主机变量 :SomeValue 设置为 1 并定义用于从数据库填充到大小 1 的主机变量数组,例如在开放问题中发布的请求的参数化实际上是有效的

  struct
  ??<
       char       SL_ISO2   ??(1??) ??(3??); // sorry for Z/os trigraphs
       etc..

如果我将主变量数组设置为更大的定义整数值(即 20)并将值(:SomeValue)硬编码为游标行集提取中的该值,它也可以工作。

 EXEC SQL

     FETCH NEXT ROWSET FROM C_NJSRD2
     FOR 20 ROWS
     INTO

             :NJCT0022.SL_ISO2         :NJMT0022.iSL_ISO2
            ,:NJCT0022.BZ_COUNTRY      :NJMT0022.iBZ_COUNTRY
            ,:NJCT0022.KZ_RISK         :NJMT0022.iKZ_RISK

我希望从调用程序(COBOL)接收行数,并相应地设置主机变量数组的大小。为了避免变量数组大小问题,将主变量数组过大到更大的值也很好。

这些组合返回编译错误:HOST VARIABLE ARRAY "NJCT0022" IS EITHER NOT DEFINED or IS NOT USABLE

4

1 回答 1

0

在良好的传统中,这是我自己问题的答案。SO的好人现在肯定会支持我。

行集非常快,除了制作主变量数组或字符数组数组之外,这些游标只需要调整程序函数以保存值和在循环中设置空值。它们是这样声明的:

     FETCH NEXT ROWSET FROM C_NJSRD2
     FOR 19 ROWS

行集游标不能动态改变宿主数组(即数组数组)的大小。与滚动游标不同,它们不能跳转到某个位置或向后移动。但是,它们不能向前移动整个预设行集的行数,而只能向前移动一行。

     FETCH NEXT ROWSET FROM C_NJSRD2 FOR 1 ROWS
     INTO

因此,要回答我的问题,为了使算法能够接受任何类型的获取请求的行号,它基本上只是将请求分段到行集并最终获取一行直到满足请求的数字的问题。要计算行集和单行的循环计数器:

if((iRowCount>iRowsetPreset)&&
 ((iRowCount%iRowsetPreset)!=0))
 ??<
  iOneLinersCount = iRowCount % iRowsetPreset;
  iRowsetsCount = (iRowCount - iOneLinersCount)
    / iRowsetPreset;    
 ??>
if ((iRowCount==iRowsetPreset) _OR_
  ((iRowCount%iRowsetPreset)==0))
  ??<
    iOneLinersCount = 0;
    iRowsetsCount = iRowCount / iRowsetPreset;
  ??>
if (iRowCount<iRowsetPreset)
  ??<
    iOneLinersCount = iRowCount;
    iRowsetsCount = 0;
  ??>
于 2020-05-22T11:50:40.513 回答