这种方法适用于大数量导入,支持中文。这种方法本质上是在通过sqlldr导入文本数据,而不是EXCEL。
首先第一步,需要将EXCEL另存为CSV
然后在程序中上传这份CSV
全部程序就不帖了。关键代码如下
#....前面上传等步骤省略
#清空临时表( 临时表需要提前建立好 本例中是 cims300_tmp )
CALL cl_del_data("cims300_tmp")
#DELETE FROM cims300_tmp WHERE 1=1;
#上传为cims300_tmp.csv,等待处理,注意是 tmp
IF NOT cl_upload_file(tm.path, '/u1/doc/cims300_tmp.csv') THEN
CALL cl_err(NULL, "lib-212", 1)
RETURN FALSE
END IF
#删除已有文件,正式文件,没有tmp
RUN " rm -f /u1/doc/cims300.csv "
LET g_msg=NULL
#使用iconv将gbk编码转化为utf-8编码 为了适应中文导入。注意文件名已经由tmp转成没有tmp
LET g_msg = "iconv -f GBK -t UTF-8 /u1/doc/cims300_tmp.csv -o /u1/doc/cims300.csv"
RUN g_msg
#授权
LET g_msg="chmod 777 /u1/doc/cims300.csv 2>/dev/null"
RUN g_msg
LET g_msg=NULL
#关键一步,oracle通过sqlldr导入文本数据 ,具体使用方法请自行百度
LET g_msg = "sqlldr userid=",g_plant,"/",g_plant," control=/u1/doc/cims300.ctl log=/u1/doc/cims300.log"
RUN g_msg
#确认临时表中有数据了
LET g_cnt = 0
SELECT COUNT(*) INTO g_cnt FROM cims300_tmp WHERE C1 != '料件编号'
IF g_cnt > 0 THEN
#开始处理
CALL cims300()
ELSE
CALL cl_err('insert_prep:','anm-259',1)# EXIT PROGRAM
LET sql_state ='N'
END IF
附上cims300.ctl的写法
load data
infile '/u1/doc/cims300.csv'
append into table cims300_tmp
when C1<>''
fields terminated by ',' Optionally enclosed by '"'
(C1,C2,C3,C4,C5,C6,C7)
转载请注明:赫非域 » TIPTOP另一种EXCEL上传方法