我在将从IBM i DB2导出的打包数据加载到另一个IBM i DB2数据库时遇到了问题。该文件来自一个供应商,并且无法使用其他类型的方法(如直接连接)。
下面是小测试文件的内容。注意,我在表示打包数据的最后两个字节之前添加了一些空格(404F):
dspf /home/person/test_file.ebcdic
************Beginning of data**************
11111111111111111 |
************End of Data********************
查看十六进制显示:
F1F1F1F1 F1F1F1F1 F1F1F1F1 F1F1F1F1 F10000 404F 11111111111111111
我创建表:
DROP TABLE IF EXISTS TESTSCHEMA.TESTTABLE ;
CREATE TABLE TESTSCHEMA.TESTTABLE (
CHARFLD1 CHAR(3),
CHARFLD2 CHAR(12),
CHARFLD3 CHAR(1),
CHARFLD4 CHAR(1),
BINFIELD1 BINARY(1),
BINFIELD2 BINARY(1),
PACKFIELD DECIMAL(3, 0)
) ORGANIZE BY ROW;
我创建了一个字段定义文件:
* COL 1 3 0
* COL 4 15 0
* COL 16 16 0
* COL 17 17 0
* COL 18 18 0
* COL 19 19 0
* COL 20 21 0
* END
尝试加载数据:
CL: CHGATR OBJ('/home/person/test_file.ebcdic') ATR(*CCSID) VALUE(37);
CL: CPYFRMIMPF FROMSTMF('/home/person/test_file.ebcdic')
TOFILE(TESTSCHEMA/TESTTABLE)
FROMCCSID(37) TOCCSID(37)
DTAFMT(*FIXED)
STMFLEN(21)
MBROPT(*REPLACE)
FROMRCD(*FIRST 1)
FLDDFNFILE(TESTLIB/TESTFILE TMEMBER)
;
但我刚得到一个错误:
Member TESTTABLE file TESTTABLE in TESTCHEMA cleared.
The copy did not complete for reason code 7.
0 records copied to member TESTTABLE.
Copy command ended because of error.
7 - The FROMFILE numeric field PACKFIELD contains blank characters, or
other characters that are not valid for a numeric field.
看起来系统忽略了实际的压缩字节,并试图加载字符,而实际上显示为空白。(19),字符和二进制字段可以正常加载。要将压缩小数加载到Linux上的不同DB2系统中,我需要在db2 load命令中使用packeddecimal选项,但是CPYFRMIMPF似乎没有提供这样的选项,有没有其他的方法可以实现这个目标?
1条答案
按热度按时间5tmbdcev1#
“导入文件”未设计为包含打包数据;它们应该是允许在IBMi和非IBMi系统之间传输数据的简单文本文件。
CPYTOIMPF会将数据解包到表中。CPYFRMIMF会在数据加载到表中时将其打包。
如果是我的话,我会把文件踢给供应商,告诉他们给予你一些有用的东西,我也会认真地重新考虑与供应商的合作。
但是如果你遇到了困难,可以尝试使用二进制模式的FTP将数据直接传输到表中。
另一个选项是使用旧的Copy From Stream File(CPYFRMSTMF)将数据移动到使用
CRTPF RCDLEN(120)
创建的临时PF中。然后使用Copy File(CPYF)命令和FMTOPT(*NOCHK)
将数据移动到实际表中。如果这些方法都不起作用,则需要编写一个RPG/COBOL程序,使用IFS API读取流文件并将数据移动到表中。