将压缩小数加载到DB2 for IBM i

zf2sa74q  于 2022-11-07  发布在  DB2
关注(0)|答案(1)|浏览(265)

我在将从IBM i DB2导出的打包数据加载到另一个IBM i DB2数据库时遇到了问题。该文件来自一个供应商,并且无法使用其他类型的方法(如直接连接)。
下面是小测试文件的内容。注意,我在表示打包数据的最后两个字节之前添加了一些空格(404F):

  1. dspf /home/person/test_file.ebcdic
  2. ************Beginning of data**************
  3. 11111111111111111 |
  4. ************End of Data********************

查看十六进制显示:

  1. F1F1F1F1 F1F1F1F1 F1F1F1F1 F1F1F1F1 F10000 404F 11111111111111111

我创建表:

  1. DROP TABLE IF EXISTS TESTSCHEMA.TESTTABLE ;
  2. CREATE TABLE TESTSCHEMA.TESTTABLE (
  3. CHARFLD1 CHAR(3),
  4. CHARFLD2 CHAR(12),
  5. CHARFLD3 CHAR(1),
  6. CHARFLD4 CHAR(1),
  7. BINFIELD1 BINARY(1),
  8. BINFIELD2 BINARY(1),
  9. PACKFIELD DECIMAL(3, 0)
  10. ) ORGANIZE BY ROW;

我创建了一个字段定义文件:

  1. * COL 1 3 0
  2. * COL 4 15 0
  3. * COL 16 16 0
  4. * COL 17 17 0
  5. * COL 18 18 0
  6. * COL 19 19 0
  7. * COL 20 21 0
  8. * END

尝试加载数据:

  1. CL: CHGATR OBJ('/home/person/test_file.ebcdic') ATR(*CCSID) VALUE(37);
  2. CL: CPYFRMIMPF FROMSTMF('/home/person/test_file.ebcdic')
  3. TOFILE(TESTSCHEMA/TESTTABLE)
  4. FROMCCSID(37) TOCCSID(37)
  5. DTAFMT(*FIXED)
  6. STMFLEN(21)
  7. MBROPT(*REPLACE)
  8. FROMRCD(*FIRST 1)
  9. FLDDFNFILE(TESTLIB/TESTFILE TMEMBER)
  10. ;

但我刚得到一个错误:

  1. Member TESTTABLE file TESTTABLE in TESTCHEMA cleared.
  2. The copy did not complete for reason code 7.
  3. 0 records copied to member TESTTABLE.
  4. Copy command ended because of error.
  5. 7 - The FROMFILE numeric field PACKFIELD contains blank characters, or
  6. other characters that are not valid for a numeric field.

看起来系统忽略了实际的压缩字节,并试图加载字符,而实际上显示为空白。(19),字符和二进制字段可以正常加载。要将压缩小数加载到Linux上的不同DB2系统中,我需要在db2 load命令中使用packeddecimal选项,但是CPYFRMIMPF似乎没有提供这样的选项,有没有其他的方法可以实现这个目标?

5tmbdcev

5tmbdcev1#

“导入文件”未设计为包含打包数据;它们应该是允许在IBMi和非IBMi系统之间传输数据的简单文本文件。
CPYTOIMPF会将数据解包到表中。CPYFRMIMF会在数据加载到表中时将其打包。
如果是我的话,我会把文件踢给供应商,告诉他们给予你一些有用的东西,我也会认真地重新考虑与供应商的合作。
但是如果你遇到了困难,可以尝试使用二进制模式的FTP将数据直接传输到表中。
另一个选项是使用旧的Copy From Stream File(CPYFRMSTMF)将数据移动到使用CRTPF RCDLEN(120)创建的临时PF中。然后使用Copy File(CPYF)命令和FMTOPT(*NOCHK)将数据移动到实际表中。
如果这些方法都不起作用,则需要编写一个RPG/COBOL程序,使用IFS API读取流文件并将数据移动到表中。

相关问题