9

I am using SQL LOADER to load multiple csv file in one table. The process I found is very easy like

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
  )

But I don't want to use INFILE multiple time cause if I have more than 1000 files then I have to mention 1000 times INFILE in control file script.

So my question is: is there any other way (like any loop / any *.csv) to load multiple files without using multiple infile?

Thanks, Bithun

4

5 回答 5

11

解决方案1:你可以将1000个文件连接成一个大文件,然后由SQL*Loader加载。在 unix 上,我会使用类似的东西

cd path
cat file*.csv > all_files.csv
于 2013-07-01T13:53:56.930 回答
4

解决方案 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;
于 2013-07-01T13:55:08.540 回答
4

您可以像这样使用通配符(? 表示单个字符,* 表示任何数字):

infile 'file?.csv'

;)

于 2018-04-26T15:23:47.017 回答
1

从外壳循环文件:

#!/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
于 2014-08-13T08:00:22.657 回答
-2
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)

是否会检查所有CSV数据并加载数据

于 2016-04-08T10:45:20.820 回答