gpt4 book ai didi

ibm-midrange - CRTPGM 和 UPDPGM 有什么区别

转载 作者:行者123 更新时间:2023-12-05 09:29:04 27 4
gpt4 key购买 nike

假设我的模块发生了一些变化,所以我不得不更新服务程序,结果签名发生了变化。那么我不应该选择哪个选项?我应该使用 CRTPGM 还是 UPDPGM 来重新创建使用服务程序的程序。在这种情况下,您能说出 CRTPGM 和 UPDPGM 之间的区别吗?

最佳答案

首先,您不应该仅仅因为 *SRVPGM 已更改就需要 CRTPGM 或 UPDPGM。由于 *SRVPGM 的更改而要求 *PGM 重新编译应该是一个非常罕见且非常有意的决定。

听起来您可能正在使用 CRTSRVPGM EXPORT(*ALL),请不要那样做。而是使用 Binder 源 CRTSRVPGM EXPORT(*SRCFILE) SRCFILE(..) 来控制导出的过程和服务程序签名。硬编码签名的简单方法

STRPGMEXP SIGNATURE('MYSRVPGM Sig v1')
export symbol('Proc1')
export symbol('Proc2')
ENDPGMEXP

现在您可以加入并向服务程序添加过程,只要将导出添加到末尾,您就可以保持相同的签名,并且不会强制重新编译任何使用该服务程序的程序。

STRPGMEXP SIGNATURE('MYSRVPGM Sig v1')
export symbol('Proc1')
export symbol('Proc2')
export symbol('Proc3')
export symbol('Proc4')
ENDPGMEXP

在这种情况下,您不能删除或重新排序导出。

如果您确实需要确保重新编译所有调用程序,那么您只需更新硬编码签名即可。

STRPGMEXP SIGNATURE('MYSRVPGM Sig v2')
export symbol('Proc1')
export symbol('Proc3')
export symbol('Proc4')
ENDPGMEXP

另一种方法是让系统生成签名,并使用*CURRENT*PRV block 。但是您仍然无法在不破坏现有调用者的情况下删除或重新排序导出。所以社区的共识是简单地硬编码签名。 IBM 本身在操作系统中包含的 *SRVPGM 对象中遵循了这一做法。

要意识到的两件重要的事情是

  • 过程签名(参数的数量和类型)与*SRVPGM 签名无关。
  • 过程名称在 *PGM 对象的“绑定(bind)”时间被解析,在执行期间调用实际上是按位置进行的。

例如,如果我有这个

dcl-pr Proc1 extproc(*dclcase);
parm1 char(10);
end-pr;
dcl-pr Proc2 extproc(*dclcase);
parm1 char(20);
end-pr;

带 Binder 源

STRPGMEXP SIGNATURE('MYSRVPGM Sig v1')
export symbol('Proc1')
export symbol('Proc2')
ENDPGMEXP

我能做到

dcl-pr Proc1 extproc(*dclcase);
parm1 char(10);
parm2 char(20) option(*nopass);
end-pr;
dcl-pr Proc2_depreciated extproc(*dclcase);
parm1 char(20);
end-pr;
dcl-pr Proc2 extproc(*dclcase);
parm1 varchar(100) const;
end-pr;

带 Binder 源

STRPGMEXP SIGNATURE('MYSRVPGM Sig v1')
export symbol('Proc1')
export symbol('Proc2_deprecated')
export symbol('Proc2')
export symbol('Proc3')
ENDPGMEXP

现有的 *PGM 调用 Proc2() 将继续调用现在重命名的代码 Proc2_deprecated()。调用 Proc2() 的新的或重新编译的现有 *PGM 将调用名为 Proc2() 的新添加代码。

现在对您的问题提供一个不完整的答案,

what is the difference between CRTPGM and UPDPGM?

我很确定存在差异,我知道当使用 UPDSRVPGM 而不是 CRTSRVPGM 时,*SRVPGM 对象中的一些元数据不会更新。我敢打赌 UPDPGM 也是如此。此外,CRTPGM 有一个参数
允许 *SRVPGM 库更新。 . ALWLIBUPD,默认为 *NO,因此如果您更新的服务程序在另一个库中,您可能必须使用 CRTPGM。

老实说,在这个平台上工作了 30 年,我从未使用过 UPDPGM 或 UPDSRVPGM。大多数时候,我的 *PGM 是单个模块并使用绑定(bind)目录来查找 *SRVPGM,因此通过 CRTBNDRPG 重新创建非常简单。 *SRVPGM 要么是单个模块,要么具有特定于其创建的唯一绑定(bind)目录。

我在职业生涯中使用的变更管理工具也重新创建了对象,而不是使用 UPDPGM 或 UPDSRVPGM。

最后,如果您是 ILE 和 *SRVPGM 的 Scott Klement 的新手 ILE Concepts (for the Impatient RPG Programmer)演示文稿是老歌,但却是好东西。

关于ibm-midrange - CRTPGM 和 UPDPGM 有什么区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70854549/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com