分配整个数据结构在数组中为空

时间:2015-03-26 14:55:36

标签: db2 ibm-midrange rpgle

问题之前的一些背景。

想象一下文件FileA有大约50个不同类型的字段。我尝试使用服务程序,而不是使用该文件的所有程序,因此该文件只能由该服务程序访问。然后,调用该服务的程序将基于文件结构接收DataStructure,作为ExtName。我使用SQL来恢复信息,所以,基本上,程序将是这样的:

服务程序共享的数据结构:

D FileADS       E  DS                 ExtName(FileA) Qualified

程序调用的程序:

P getFileADS      B                   Export 
D                 PI              N
D  PI_IDKey                      9B 0 Const
D  PO_DS                              LikeDS(FileADS)

D LocalDS       E DS                  ExtName(FileA) Qualified
D NullInd         S              5i 0 Array(50)    <-- Since 50 fields in fileA

 //Code
 Clear LocalDS;
 Clear PO_DS;

 exec sql
   SELECT *
   INTO   :LocalDS :nullind
   FROM   FileA
   WHERE  FileA.ID = :PI_IDKey;

 If SqlCod <> 0;
   Return *Off;
 EndIf;

 PO_DS = LocalDS;
 Return *On;

P getFileADS      E

因此,如果找到它,该过程将返回一个填充了FileA记录的数据结构。

现在我的问题:有没有办法在不指定文件的每个50个字段的情况下分配%nullind(field)= * On?

像循环

 i = 1;
 DoW (i <= 50);
   if nullind(i) = -1;
     %nullind(datastructure.field) = *On;
   endif;
   i++;
 EndDo;

因为让我们面对它,每次查看每个文件的每个字段都会很痛苦。

我知道一个简单的链(n)可以做到这一点

 chain(n) PI_IDKey FileA FileADS;

但我真的希望用SQL来做。

感谢您的建议!

操作系统版本:7.1

4 个答案:

答案 0 :(得分:0)

首先,通过消除SELECT *并提供50个字段名称的SELECT列表,从长远来看,你会更好。

接下来,请考虑这两个网页 - Meaningful Names for Null IndicatorsEmbedded SQL and null indicators。第一个显示了为每个空指示符分配名称以匹配关联字段名称的示例。根据空指标数组的地址,只需基于名称声明基于DS的DS即可。第二个指出了空指标数组如何大于所需数量,因此未来的数据库更改不会影响结果。 (请记住,页面显示的是1000个元素的空数组,即使在那个大小的情况下,内存实际上也相对较小。如果您认为由于某种原因它是必要的,您可以声明它更小。)

您正在创建一个只会写一次的过程。不值得保存列出50个字段的努力。也许如果你有很多使用这个程序的程序,你每次使用SELECT *时都需要创建一个列表,但即使这样,它也不是一个好主意。

可以在将保存proc原型的/ COPY成员中定义50个数据字段的匹配模板DS。模板DS将在任何带有proc原型的程序中可用。任何需要调用proc的程序都可以简单地指定LIKEDS引用模板以在内存中定义其版本。模板DS应该包含QUALIFIED关键字,然后程序将使用自己的DS名称作为限定前缀。可以类似地处理空指示符数组。

但是,您的实际问题并不完全清楚。你展示了一个示例循环并询问它是否有效,但你不会说你是否有问题。它是一个数组,所以循环可以像你展示的那样使用。但这取决于你用它实际上想要实现的目标。

答案 1 :(得分:0)

旧学校RPG的

只是在用select语句填充的数据结构中包含空值。

select col1, ifnull(col1), col2, ifnull(col2), etc.  into :dsfilewithnull where f.id = :id;

对于无法处理空值的旧学校RPG,请使用select语句删除它们。

select coalesce(col1,0), coalesce(col2,' '), coalesce(col3, :lowdate) into :dsfile where f.id = :id;

第二种方法在传统环境中更容易使用。

将值按值传递给过程,以便像内置函数一样使用它。

答案 2 :(得分:0)

您的问题的一个答案是将数组作为数据结构的一部分,并指定* all&#39; 0&#39;到数据结构。

dcl-ds nullIndDs;
  nullInd      Ind Dim(50);
end-ds;

nullIndDs = *all'0';

答案 3 :(得分:0)

jmarkmurphy的答案是将所有零分配给指标数组的示例。对于您在问题中显示的示例,您可以这样做:

 D NullInd         S              5i 0 dim(50)

  /free
    NullInd(*) = 1 ;
    Nullind(*) = 0 ;

    *inlr = *on ;
    return ;
  /end-free

这是一个可以编译和测试的完整程序。在调试中运行它并在第一个语句处停止。显示NullInd以查看其元素的初始值。逐步执行第一个语句并再次显示它以查看元素的更改方式。逐步完成下一个语句,看看情况如何再次发生变化。

对于“如何在SQL中执行”,该部分没有意义。当你FETCH一行时,SQL会自动设置值 。除此之外,主机语言(在本例中为RPG)使用该数组将值传递回SQL。当SQL语句运行时,它再次自动使用所设置的任何值。因此,它可以由SQL自动用于输入或输出,也可以由宿主语言语句设置。您可以使用该数组“在SQL中”执行任何有用的操作。