我在将从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.
系统似乎忽略了实际的压缩字节,并试图加载实际上显示为空白的字符。如果我使用STMFLEN(19(稍微更改CPYFRMIMPF以忽略压缩decmial,则字符和二进制字段加载时不会出现问题,正如预期的那样。要在linux上将压缩的小数加载到不同的DB2系统中,我需要在DB2 load命令中使用packeddecimal选项。但CPYFRMIMPF似乎没有提供这样的选择。还有别的办法吗?
"导入文件";不是为包含打包数据而设计的;它们应该是简单的文本文件,以允许在IBMi和非IBMi系统之间传输数据。
CPYTOIMPF将解压缩表中的数据。CPYFRMIMPF将在数据加载到表时对其进行打包。
如果是我,我会把文件交回供应商,让他们给你一些可用的东西。首先,我也会认真考虑与供应商合作。
但如果你被卡住了。尝试在二进制模式下使用FTP将数据直接传输到表中。
另一种选择是使用旧的"从流文件复制"(CPYFRMSTMF(将数据移动到使用CRTPF RCDLEN(120)
创建的临时PF中。然后将"复制文件"(CPYF(命令与FMTOPT(*NOCHK)
一起使用,将数据移动到实际的表中。
如果这些都不起作用,那么您需要编写一个RPG/COBOL程序,该程序使用IFSAPI读取流文件并将数据移动到表中。