通过SQLLDR将多个csv加载到一个表中

时间:2013-07-01 12:59:33

标签: sql oracle sql-loader

我正在使用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

5 个答案:

答案 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) 并加载数据