将压缩小数加载到IBM i的DB2中



我在将从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读取流文件并将数据移动到表中。

最新更新