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

时间:2017-11-14 07:01:07

标签: sql db2 cobol mainframe

我在工作存储部分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

提前致谢!

2 个答案:

答案 0 :(得分:0)

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

除非你需要算术,否则你可以逃脱PIC X(15)。仅仅因为某些东西被称为“数字”并不意味着它必须存储为计算。将名为“Number”的字段存储为字符数据通常更有效。例如社会保险号 - 你很少需要加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字段。

答案 1 :(得分:0)

您正在寻找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