ibm-midrange - CL CALL 语句中传递参数的类型

标签 ibm-midrange control-language

在运行 i/OS 6.1 的 iSeries 上,我有一个正在清理的 CL 程序。在此程序中,有一堆以下形式的剪切和粘贴代码:

IF COND(&ENV='PRD') THEN(DO)
    CALL JCHKSTS PARM(&RS '127.0.0.1' '6500')
    /* more junk here */
ENDDO
IF COND(&ENV='TST') THEN(DO)
    CALL JCHKSTS PARM(&RS '127.0.0.1' '16500')
    /* more junk here, same as in the first block */
ENDDO
/* repeat for several more &ENV values */

当然,当我看到这个时,我的第一个想法是,让我们将该端口号移到一个变量中并消除所有重复的代码块,所以我最终得到:

DCL &ENVPORT *CHAR(6)
IF COND(&ENV='PRD') THEN(CHGVAR VAR(&ENVPORT) VALUE('6500'))
IF COND(&ENV='TST') THEN(CHGVAR VAR(&ENVPORT) VALUE('16500'))
CALL JCHKSTS PARM(&RS '127.0.0.1' &ENVPORT)
/* more junk here, but only one copy of it now. */

当我运行此代码时,它失败了,因为事实证明 JCHKSTS 程序需要一个字符串作为其第三个参数(它在内部转换为整数)和 &ENVPORT 变量,尽管已声明为字符串并初始化带有字符串值,显然没有作为字符串传递。 (检查 JCHKSTS 中的参数显示端口值的值为 MAXINT。)

我通过将值从 '6500' 更改为 '6500 ' 的廉价权宜之计解决了这个问题,但我不明白为什么它不起作用首先; IBM 文档说:

A program variable can be passed if the call is made from a CL program or ILE CL procedure, in which case the receiving program must declare the field to match the variable defined in the calling CL program or ILE CL procedure.

这对我来说肯定是这样的,接收程序需要一个字符串,我将变量声明为 6 个字符的字符串,它应该可以工作。

所以,我错过了什么吗?我应该如何声明变量以便接收程序将其视为数字的字符串表示形式,而不是实际的数字?

最佳答案

作为文字传递的字符变量的默认长度是 32。我的猜测是 JCHKSTS 需要 32 字节变量。尝试DCL &ENVPORT *CHAR 32

关于ibm-midrange - CL CALL 语句中传递参数的类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18090348/

相关文章:

ibm-midrange - CL 程序中的堆栈实现 (OS400/iSeries)

ibm-midrange - 从COBOL或CL调用Web服务

ibm-midrange - CL : Path name contains embedded nulls (CPD018A)

NHibernate - 为什么 Delete() 调用无法删除但通过 HQL 删除有效?

tomcat - 在 Spring 中或作为 Tomcat 资源配置 AS400JDBCXADataSource 时如何设置默认模式?

ibm-midrange - 对名称带有 @ 或 # 字符的表运行 SQL 查询会在不同的 CCSID 上显示问题

ibm-midrange - 在 DSPF 中包含带有 MSGID 的动态文本

ibm-midrange - 将可变大小的字符串写入 IFS 文件

ibm-midrange - 使用 SNDDST 发送邮件