【问题标题】:db2 rowset cursor parametrizationdb2 行集游标参数化
【发布时间】:2020-06-19 04:21:11
【问题描述】:

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

在这个问题/sn-p 中代替 :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) 中接收行数,并在理想情况下相应地设置主变量数组的大小。为避免变量数组大小问题,将宿主变量数组过大到更大的值也是不错的。

这些组合返回编译错误: 主机变量数组“NJCT0022”未定义或不可用

【问题讨论】:

  • 问题不清楚,因为:SomeValue 是一个主机变量,因此不一定是硬编码的。 Db2-for-Z/OS v10 及更高版本支持该语法。
  • 不能使用主变量,只能使用硬编码的数字。这就是我要问的原因,问题应该足够清楚。我认为从 DB2 v8 开始启用行集游标
  • 请编辑您的问题以在您的站点上添加 Db2-for-z/os 的版本,并添加您在尝试主机变量时收到的确切错误消息。

标签: sql c db2 rowset


【解决方案1】:

按照良好的传统,这里是我自己问题的答案。 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;
  ??>

【讨论】:

    猜你喜欢
    • 2022-01-18
    • 1970-01-01
    • 2021-08-29
    • 2014-02-17
    • 2013-11-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-27
    相关资源
    最近更新 更多