我有一个 COBOL-DB2 代码,它从 DB2 获取数据并将值移动到副本变量(XML 结构)。在执行 XML 生成时,代码失败并显示 XML-CODE=000000417。这是因为 DB2 值具有垃圾值。现在,我正在尝试寻找以下问题的答案。希望有人能帮忙
注意:在生成 XML 之前检查/执行变量可能会很困难,因为需要生成多个组变量。此外,对于检查,我们需要知道垃圾值列表。 2)是否有可能获得垃圾值列表?可能听起来很傻
DB2 中的数据 - 拉尔夫斯篮球队。 您可以在 Ralph_s 中的 h 和 s 之间看到一个垃圾字符。 Junk 的十六进制值为 '3F'
代码:
从 DB2 获取数据,然后,
MOVE NAME TO Name1
IN Output
MOVE ADDRESS1 TO ADDRESS
IN Output
MOVE SPACES TO WS-XML-OUTPUT
XML GENERATE WS-XML-OUTPUT FROM Output
COUNT IN WS-NUMS
SUPPRESS EVERY nonnumeric element WHEN SPACE
EVERY nonnumeric element WHEN LOW-VALUES
ON EXCEPTION
SET ERROR IN WS-ACTION
MOVE XML-CODE TO WS-XML-CODE
STRING 'XML GENERATE ERROR AT POSITION='
WS-NUMS
', XML-CODE=' WS-XML-CODE
', XML=' WS-XML-OUTPUT(1:100)
INTO WS-ERROR-TEXT
NOT ON EXCEPTION
MOVE WS-XML-OUTPUT TO WS-REC
.
.
END-XML
注意:在 DB2 获取之后,我无法使用下面的代码将垃圾替换为空格。这是因为有多个组变量需要生成 XML,并且不能在每个组变量上使用。这可能会影响性能。
从 1 × 1 执行 IX1,直到 IX1 > 100 如果名称(IX1:1) < SPACE Move space to NAME(IX1:1) END-IF END-PERFORM
寻找更好的通用解决方案。谢谢你
我将对@Gilbert-Le-Blanc 的评论进行一些扩展,但请不要认为这是我把话放在他嘴里。您的问题没有简单的答案。
一般情况下您无法执行此操作。一般不能这样做的原因是“垃圾值”是依赖于上下文的。在一个领域是“垃圾”的东西在另一个领域可能就不是垃圾。就您的程序而言被视为“垃圾”的内容可能是处理同一 DB2 表中同一列的另一个程序所需要的。 COBOL 不知道您认为什么是“垃圾值”,但请参阅下文。
例如,您的程序正在生成 XML,并且 XML GENERATE 在字符 x'3F' 方面存在问题。另一个程序可能正在检测 x'3F' 并将其替换为 x'7D'(撇号)。
如果您可以确定使用给定列的所有程序都将相同的单个字符值视为“垃圾值”,那么您可以请求在该列上放置一个 BEFORE INSERT OR UPDATE 触发器,该触发器将发出错误信号(或修改用于 INSERT 或 UPDATE 的数据)如果存在“垃圾值”,那么“垃圾值”将永远不会进入 DB2 表。请注意,这可能涉及逐字符处理传入的数据。这还涉及重新处理表的现有内容,以确保其符合新的“垃圾值”触发器。
您对程序中逐个字符处理每个字段的性能的担忧已被注意到,但是代码中替换“垃圾值”的任何过程都将逐个字符地发生,无论您是否明确地在您的程序中代码或编译器生成的代码或运行时例程中的“幕后”。
您也许可以通过多行获取来抵消性能问题,这是一个完全独立的主题。如果您的商店不愿意阻止“垃圾值”进入系统,那么您必须逐个字符地处理每个字段,以将不符合 XML GENERATE 流程的值替换为不符合 XML GENERATE 流程的值。一种方法是......
* Untested, freehand, not guaranteed to compile or work at all
Working-Storage Section.
01 WS-CONVERT-JUNK.
05 WS-CONVERT-FROM PIC X(255) VALUE
X'000102030405060708090A0B0C0D0E0F
- '101112131415161718191A1B1C1D1E1F
- '202122232425262728292A2B2C2D2E2F
- '303132333435363738393A3B3C3D3E3F
- '404142434445464748494A4B4C4D4E4F
- '505152535455565758595A5B5C5D5E5F
- '606162636465666768696A6B6C6D6E6F
- '707172737475767778797A7B7C7D7E7F
- '808182838485868788898A8B8C8D8E8F
- '909192939495969798999A9B9C9D9E9F
- 'A0A1A2A3A4A5A6A7A8A9AAABACADAEAF
- 'B0B1B2B3B4B5B6B7B8B9BABBBCBDBEBF
- 'C0C1C2C3C4C5C6C7C8C9CACBCCCDCECF
- 'D0D1D2D3D4D5D6D7D8D9DADBDCDDDEDF
- 'E0E1E2E3E4E5E6E7E8E9EAEBECEDEEEF
- 'F0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF'.
* Code page 37
05 WS-CONVERT-TO PIC X(255) VALUE
X'40404040404040404040404040404040
- '40404040404040404040404040404040
- '40404040404040404040404040404040
- '40404040404040404040404040404040
- '40404040404040404040404B4C4D4E40
- '504040404040404040405A5B5C5D5E40
- '60614040404040404040406B6C6D6E6F
- '404040404040404040407A7B7C7D7E7F
- '40404040404040404040404040404040
- '40818283848586878889404040404040
- '40919293949596979899404040404040
- '4040A2A3A4A5A6A7A8A9404040404040
- '40404040404040404040404040404040
- '40C1C2C3C4C5C6C7C8C9404040404040
- '40D1D2D3D4D5D6D7D8D9404040404040
- '4040E2E3E4E5E6E7E8E9404040404040
- 'F0F1F2F3F4F5F6F7F8F9404040404040'.
...您为每个您希望用空格替换的“垃圾值”编码 x'40',并为每个您不希望替换的相同相应的十六进制值。您必须注意正在使用的代码页,并记住 DB2 表的代码页可能与 COBOL 程序的代码页不同。然后,对于程序中包含从 DB2 表中获取的字符数据的每个工作存储标识符,您可以进行编码...
INSPECT field CONVERTING WS-CONVERT-FROM TO WS-CONVERT-FROM
...您的 XML GENERATE 不会抱怨无效值。