程序需要将 return 数组数据结构元素返回到调用 t 的程序中

Program need to return array data structure elements back to the program where it's called t

我有需要 return 数组数据结构元素返回调用程序的要求。最初我想使用数组数据结构(9999- 最大暗淡)作为调用程序的参数..有那里有 50 个调用程序。只有一些程序需要这个数组数据。我被要求使用临时文件(qtemp)来插入和检索。我实现了它并且工作正常。想知道比我们实现的更好的解决方案所以远(需要并发).thanks

可能有几十种方法可以处理这个问题。一些想法:

  1. 正在使用临时文件。这是 QTEMP 库擅长的事情。您可以创建文件并使用数据填充文件,知道这些文件将在作业结束时被删除,或者如果您自己明确删除它们之前。它们可以像可变长度数组一样工作,RPG 目前不能很好地支持这一点。如果您尝试,您的并发问题可能会被克服。 RPG F-specs 和非动态 SQL 没有通过在字符串中传递名称来选择文件的好方法,但巧妙地使用 OVRDBF 和 DLTOVR 命令可以为主程序提供花哨的步法创建一个具有唯一名称的目标文件,将其覆盖为预期的名称,然后调用第二个程序。这让第二个程序可以使用通用的 F-spec 或静态 SQL 名称编写,但它实际上会写入覆盖的文件。

  2. 调用程序时传递一个大数组。如果您自己分配和取消分配 space,您可以通过确保每个被调用程序都有自己的数组来写入来处理任何并发问题。有些人可能会担心这会浪费内存或效率低下。确实,您将分配被调用程序可能不会使用的大块内存,但在这个操作系统上是否存在这样的问题?考虑一些事情:参数通常通过引用传递,而不是通过值传递,因此数组的内容不必从一个副本到另一个副本; RPG 不会初始化数据结构,将它们设置为空白和零,除非你指定 INZ 关键字,所以取出 space 一个大数组只是保留 space,而不是写入它,你可以通过max 使用 size 作为参数也是为了避免阅读垃圾内容;考虑到 IBM i 的单级存储概念(临时数据库文件可能有更多的开销,因为DB2 引擎需要创建它并跟踪它的字段和记录)。换句话说,将大块内存传递给你的子程序可能会增加你的总内存占用量,但如果你聪明的话,它不一定会使你的程序变慢。

  3. 创建一个用户space 对象并将其用作共享内存区域。我不经常这样做,因为它感觉更像是一种使用指针的 C 技术,但它肯定是提供自由格式 space 以编写您想要的任何内容的有用方法。系统 API 经常使用这些用户 space 将信息传递出被调用程序。在RPG中使用指针读取用户的例子space can be found here。您可以通过在 QTEMP 中创建单独的、唯一命名的 userspace 来处理并发,如果需要,可以创建不同大小的用户,并将它们的名称和大小传回调用程序以供其读取。它们的可变大小可以使您的内存占用量小于固定大小的数组。如果 IBM 选择像他们那样广泛地在 API 中使用它们,那一定是一项很好的技术。您可以将指针代码包含在一个或两个小部分中,甚至可以通过将数据结构映射到用户来清理它space,以便使用 BASED 关键字更容易读写。

  4. 您可以创建一个回调程序,每次调用时都传递一个数据结构条目。这可能是内存最少的方法,具体取决于您的数据是从何处加载或创建的。它类似于在其他系统中以迭代器或枚举器的名义使用的延迟加载。这个想法是多次调用一个函数,每次都获得一个条目。在任何时候都不需要立即将整个东西加载到内存中。如果您查看代码的过程指针部分而不是 userspace 部分,The same example given above 显示了一种执行此技术的方法。我尝试过的另一种方法是制作一个数据结构的原型,其中包含三个过程指针,用于函数 Current、MoveNext 和 Reset。 RPG 让你自己做比 Microsoft.NET 中的 IEnumerable 更多的管道,但如果你愿意自己编写,这些概念适用于延迟加载任何大小的数据集。您不会进行编译时检查,但是一旦理解了模式,正确地编写这种风格并不难。这让我想起了在 C 中模拟面向对象编程:给自己设定一些规则来遵循,当然它有效。

  5. 另一个基于回调的示例可以在 DB2 SQL 系统如何与用 RPG 或 C 编写的外部用户定义的 Table 函数(UDTF)交互中看到。一个示例这可以在 Birgitta Hauser 的优秀文章 The Power of User-Defined Table Functions 中找到。我并不是建议您实际为您的目的创建一个 UDTF(尽管这将是一个合法的解决方案,如果开销更高的话),而是要查看它们在调用外部程序时使用的回调机制。它多次调用子程序:打开(必要时进行初始化),每次获取的次数不受限制,直到完成,然后关闭(必要时清理和关闭文件)。使用这样的模式是另一种一次只传递一个数据结构而不是整个数组的方法,如果您的潜在数据量很大或不可预测,它可能非常有吸引力。

希望这对您有所帮助。可能还有其他我现在没有想到的方法可以做到这一点。也许其他人会附和他们。