如何接受部分变量(字符串)作为cobol中的动态值?

Posted

技术标签:

【中文标题】如何接受部分变量(字符串)作为cobol中的动态值?【英文标题】:how to accept part of variable(string) as dynamic value in cobol? 【发布时间】:2017-11-14 07:01:06 【问题描述】:

我在工作存储部分 WS_CONTRACT_NUM 中有一个字段,它几乎没有 15 个字符的硬编码值。但前 5 个字符可以是任何字符,我的问题是在这种情况下如何声明这个变量。

WORKING STORAGE
 01 WS_CONTRACT_NUM PIC X(15) VALUE '?????9999999999' --- > instead of '?' what can i give so that dynamic value can be substituted in my query.

我正在执行这样的选择查询:

EXEC SQL
  SELECT * FROM TABLE WHERE CONTRACT_NUM = :WS_CONTRACT_NUM
END-EXEC

提前致谢!

【问题讨论】:

SELECT * 是一种不好的做法。如果将一列添加到表中,您的代码将中断。始终明确选择您需要的列,并且只选择您需要的列。 【参考方案1】:

您正在寻找 SQL LIKE,请参阅IBM docs,其中

下划线字符 (_) 代表任何单个字符。 百分号 (%) 表示零个或多个字符的字符串。

要在 COBOL 中使用它,您可以

MOVE '_____9999999999' TO WS_CONTRACT_NUM 
EXEC SQL
  SELECT * FROM TABLE WHERE CONTRACT_NUM LIKE :WS_CONTRACT_NUM
END-EXEC

或者(不太可能你想这样做)

EXEC SQL
  SELECT * FROM TABLE WHERE CONTRACT_NUM LIKE '%9999999999'
END-EXEC

或者也许(我没有选择测试这个,请报告)

MOVE '%9999999999' TO WS_CONTRACT_NUM
*> this may search for the trailing spaces,
*> if it does define a smaller variable
EXEC SQL
  SELECT * FROM TABLE WHERE CONTRACT_NUM LIKE :WS_CONTRACT_NUM
END-EXEC

【讨论】:

【参考方案2】:

PIC X 是任意字符符号。所以PIC X(5)9(10)

除非你需要做算术,否则你可以使用PIC X(15)。仅仅因为某些东西被称为“数字”并不意味着它必须作为计算存储。将称为“数字”的字段存储为字符数据通常更有效。例如社会保险号 - 您很少需要加 1 或除以 2,因此您可以将字段视为 PIC X。

或者在这种情况下增加清晰度:

01 ws-contract-value.
   05 first-part pic x(5).
   05 contract-number pic 9(10).   *> or x(10) unless you need to do math

如果需要验证字符数据是否全为数字,可以使用IF field IS NUMERIC ...来验证PIC X字段。

【讨论】:

我了解使用 PIC X 声明字段的部分。但是,我的归档值是在工作存储中硬编码的(1 个 contract_num 有 16 个值)。我还需要在我的问题中提到的 SQL 查询中的这些值,这将影响我的 db2 表。

以上是关于如何接受部分变量(字符串)作为cobol中的动态值?的主要内容,如果未能解决你的问题,请参考以下文章

如何在cobol中显示comp变量的实际值

Spark-sql 数据砖中的变量动态分配值

如何在cobol中打印小数点?

如何接受 JPA 排序值的 @OrderBy 作为动态参数?

为啥 MariaDB 不接受我的字符串变量作为我的 sql 查询中的表名?

在 COBOL 中使用 COMP 的变量