我正在使用SQL LOADER在一个表中加载多个csv文件。 我找到的过程非常简单
LOAD
DATA
INFILE '/path/file1.csv'
INFILE '/path/file2.csv'
INFILE '/path/file3.csv'
INFILE '/path/file4.csv'
APPEND INTO TABLE TBL_DATA_FILE
EVALUATE CHECK_CONSTRAINTS
REENABLE DISABLED_CONSTRAINTS
EXCEPTIONS EXCEPTION_TABLE
FIELDS TERMINATED BY ","
OPTIONALLY ENCLOSED BY '"'
TRAILING NULLCOLS
(
COL0,
COL1,
COL2,
COL3,
COL4
)
但如果我有超过1000个文件,我不想多次使用INFILE,那么我必须在控制文件脚本中提及1000次INFILE。
所以我的问题是:有没有其他方法(比如任何循环/任何* .csv)加载多个文件而不使用多个infile?
谢谢, Bithun
答案 0 :(得分:10)
解决方案1:您可以将1000个文件连接到大文件上,然后由SQL * Loader加载。在unix上,我会使用像
这样的东西cd path
cat file*.csv > all_files.csv
答案 1 :(得分:3)
解决方案2:使用外部表并使用PL / SQL过程加载数据:
CREATE PROCEDURE myload AS
BEGIN
FOR i IN 1 .. 1000 LOOP
EXECUTE IMMEDIATE 'ALTER TABLE xtable LOCATION ('''||to_char(i,'FM9999')||'.csv'')';
INSERT INTO mytable SELECT * FROM xtable;
END LOOP;
END;
答案 2 :(得分:2)
您可以使用通配符(?表示单个字符,*表示任意数字),如下所示:
infile 'file?.csv'
)
答案 3 :(得分:0)
循环shell中的文件:
#!/bin/bash
for csvFile in `ls file*.csv`
do
ln -s $csvFile tmpFile.csv
sqlldr control=file_pointing_at_tmpFile.ctl
rm tmpFile.csv
done
答案 4 :(得分:-1)
onClick
OPTIONS (skip=1)
LOAD DATA
INFILE /export/home/applmgr1/chalam/Upload/*.csv
是否会检查所有REPLACE INTO TABLE XX_TEST_FTP_UP
FIELDS TERMINATED BY ','
TRAILING NULLCOLS
(FULL_NAME,EMPLOYEE_NUMBER)
并加载数据