我在工作存储部分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
提前致谢!
答案 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