我有一个COBOL-DB2代码,它从DB2获取数据并将值移动到copybook变量(XML结构)。在执行XML Generate时,代码失败,XML-CODE=000000417。这是因为DB2值有一个垃圾值。现在,我试图找到下面问题的答案。希望有人能帮助
1.在做XML生成的时候如何消除垃圾字符?有没有什么功能?
注意事项:在XML生成之前检查/执行变量可能很困难,因为有多个组变量要生成XML。此外,对于检查,我们需要知道垃圾值的列表。
1.有没有可能获得垃圾值列表?可能听起来很傻
如果有好的解决方案,对解决上述问题会很有帮助,谢谢
DB2中的DATA-Ralph_s Basketball Team。您可以在Ralph_s中的h和s之间看到一个垃圾字符。垃圾的十六进制值为x'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,并且不能在每个组变量上使用。这可能会影响性能。
Perform IX1 from 1 by 1 until IX1 > 100
IF NAME(IX1:1) < SPACE
Move space to NAME(IX1:1)
END-IF
END-PERFORM
型
寻找一个更好的解决方案和通用的。
1条答案
按热度按时间gev0vcfq1#
我将对@Gilbert-Le-Blanc的评论进行扩展,但请不要认为这是我把话放在他的嘴里。
一般情况下不能这样做。一般情况下不能这样做的原因是“垃圾值”是与上下文相关的。在一个字段中是“垃圾”的内容在另一个字段中可能不是垃圾。对于您的程序来说被认为是“垃圾”的内容可能是另一个程序在处理同一个DB2表中的同一列时所需要的。COBOL不知道您认为是“垃圾值”的内容,但请参阅下面的内容。
例如,您的程序正在生成XML,而XML GENERATE对字符x '3F'有问题。另一个程序可能正在检测x '3F'并将其替换为x '7 D'(撇号)。
如果可以确定使用给定列的所有程序都将相同的单个字符值视为“垃圾值”,则可以请求在该列上放置一个BEFORE PROTECTOR UPDATE触发器,该触发器将在该列上发出错误信号(或修改用于UPDATE或UPDATE的数据)如果存在“垃圾值”,那么“垃圾值”永远不会进入DB2表。注意,这可能涉及到逐个字符地处理传入数据。这还涉及到重新处理表的现有内容,以确保它符合新的“垃圾值”触发器。
我们注意到了你对程序中逐个字符处理每个字段的性能的关注,但是在你的代码中替换“垃圾值”的任何过程都会逐个字符地发生,无论是在你的代码中显式地发生,还是在编译器生成的代码中或运行时例程中的“幕后”发生。
您可能能够通过多行读取来抵消您的性能问题,这是一个完全独立的主题。
如果您的商店不愿意阻止“垃圾值”进入系统,那么您必须逐个字符处理每个字段,以将冒犯XML GENERATE过程的值替换为不冒犯的值。
字符串
..对于程序中包含从DB2表中获取的字符数据的每个工作存储标识符,您可以编写...
型
.并且您的XML GENERATE不会抱怨无效值。