db2 如何在COBOL中生成XML时消除垃圾值

mkh04yzy  于 4个月前  发布在  DB2
关注(0)|答案(1)|浏览(90)

我有一个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


寻找一个更好的解决方案和通用的。

gev0vcfq

gev0vcfq1#

我将对@Gilbert-Le-Blanc的评论进行扩展,但请不要认为这是我把话放在他的嘴里。
一般情况下不能这样做。一般情况下不能这样做的原因是“垃圾值”是与上下文相关的。在一个字段中是“垃圾”的内容在另一个字段中可能不是垃圾。对于您的程序来说被认为是“垃圾”的内容可能是另一个程序在处理同一个DB2表中的同一列时所需要的。COBOL不知道您认为是“垃圾值”的内容,但请参阅下面的内容。
例如,您的程序正在生成XML,而XML GENERATE对字符x '3F'有问题。另一个程序可能正在检测x '3F'并将其替换为x '7 D'(撇号)。
如果可以确定使用给定列的所有程序都将相同的单个字符值视为“垃圾值”,则可以请求在该列上放置一个BEFORE PROTECTOR UPDATE触发器,该触发器将在该列上发出错误信号(或修改用于UPDATE或UPDATE的数据)如果存在“垃圾值”,那么“垃圾值”永远不会进入DB2表。注意,这可能涉及到逐个字符地处理传入数据。这还涉及到重新处理表的现有内容,以确保它符合新的“垃圾值”触发器。
我们注意到了你对程序中逐个字符处理每个字段的性能的关注,但是在你的代码中替换“垃圾值”的任何过程都会逐个字符地发生,无论是在你的代码中显式地发生,还是在编译器生成的代码中或运行时例程中的“幕后”发生。
您可能能够通过多行读取来抵消您的性能问题,这是一个完全独立的主题。
如果您的商店不愿意阻止“垃圾值”进入系统,那么您必须逐个字符处理每个字段,以将冒犯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(256) 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(256) VALUE
                                  X'40404040404040404040404040404040
-                                  '40404040404040404040404040404040
-                                  '40404040404040404040404040404040
-                                  '40404040404040404040404040404040
-                                  '40404040404040404040404B4C4D4E40
-                                  '504040404040404040405A5B5C5D5E40
-                                  '60614040404040404040406B6C6D6E6F
-                                  '404040404040404040407A7B7C7D7E7F
-                                  '40404040404040404040404040404040
-                                  '40818283848586878889404040404040
-                                  '40919293949596979899404040404040
-                                  '4040A2A3A4A5A6A7A8A9404040404040
-                                  '40404040404040404040404040404040
-                                  '40C1C2C3C4C5C6C7C8C9404040404040
-                                  '40D1D2D3D4D5D6D7D8D9404040404040
-                                  '4040E2E3E4E5E6E7E8E9404040404040
-                                'F0F1F2F3F4F5F6F7F8F9404040404040'.

字符串
..对于程序中包含从DB2表中获取的字符数据的每个工作存储标识符,您可以编写...

INSPECT field CONVERTING WS-CONVERT-FROM TO WS-CONVERT-FROM


.并且您的XML GENERATE不会抱怨无效值。

相关问题