db2 - 为整个 DataStructure 分配其 nullind 数组

标签 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

最佳答案

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

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

您正在创建一个只能编写一次的过程。不值得省去列出 50 个字段的精力。也许如果您有许多程序使用此过程,并且每次都必须创建列表,那么使用SELECT *会有一点帮助,但即使如此,这也不是一个好主意。

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

但是,尚不完全清楚您的实际问题是什么。您展示了一个示例循环并询问它是否有效,但您没有说您是否遇到问题。它是一个数组,因此可以像您展示的那样使用循环。但这取决于您实际上想用它来完成什么。

关于db2 - 为整个 DataStructure 分配其 nullind 数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29281702/

相关文章:

entity-framework - 是否可以将 Entity Framework 与 DB2 iSeries AS/400 一起使用

sql - DB2中的递归查询以获取链中的所有项目

c# - 如何使用交易范围?

sql - 使用 JOIN 更新表

ibm-midrange - 返回从 cobol 到 rpg 的值

ibm-midrange - CL 命令如何构建其确切的参数列表?

node.js - 在 IBM i(以前的 iSeries/AS/400)上安装 node-sass

ibm-midrange - 是否可以使用外部指示器来激活显示文件中的显示属性?

module - 作为/400 : call C procedure from CL

java - 在 RPGLE 中使用 String.format