2010-09-22 31 views
2

我必须使用SQL Loader for Oracle加载46个包含数据的表。所有的数据文件都是CSV。46用于SQL加载程序的控制文件

CSV中的列顺序与表格中的列顺序相匹配。

我需要为每个表创建一个控制文件。

对我来说,批量生产这些文件的最佳方式是什么?

+0

数据不足 - 你告诉我们任何关于你加载文件布局。然而,我会说'ALL_TAB_COLUMNS'可以以非常有趣的方式使用。 – 2010-09-22 20:55:55

+0

@Adam Musch所有数据文件都是CSV – 2010-09-22 21:07:57

+2

太模糊。 EG,CSV中的列顺序是否与表中的列顺序匹配?也就是说,SQL Developer有一个EXPORT DATA TO LOADER选项可以生成CTL文件。 – 2010-09-23 00:34:13

回答

1

我一直在做类似的事情(大约120个表格,超过1500列)。我用excel(因为我的工作结果是一个excel文件)。
从Excel宏中,我从Adam Musch建议的DB中读取表元,然后填入表格。
我认为这也适用于你。
或者你可以使用你熟悉的语言来创建一个工具来做同样的事情。

1

我知道这是一个老问题,但它仍然是一个相关的问题。对于将来的搜索者来说,这里是我添加到我们的实用程序包中的一个过程,它为表格生成骨架控制文件。传递它的表名称,并输出一个默认的控制文件,你可以在需要的地方调整。您可能需要先进行编辑以适应您的需求。

这样调用:

set serveroutput on; 
exec utils.gen_ctl_file('TABLE_NAME'); 

的过程:

/******************************************************************************************************** 
Name:  GEN_CTL_FILE 

Desc:  Generates a skeleton control file from a table for loading data via SQL*Loader. 

Args:  tablename_in IN VARCHAR2, delim_in VARCHAR2 DEFAULT '|' 

Returns: None. 

Usage:  utils.gen_ctl_file('tablename'); 

Notes:  Prints a skeleton control file. 

      If a template for a fixed-length data file is desired, use 'FIXED' for the delim_in string. 

      Example usage: 

      set serveroutput on; 
      execute utils.gen_ctl_file('tablename'); 

************************************************************************************************************************/ 
PROCEDURE GEN_CTL_FILE(tablename_in IN VARCHAR2, delim_in VARCHAR2 DEFAULT '|') IS 
ERRNULLTABLENAME  CONSTANT NUMBER  := -20103; -- User-defined error numbers and messages. 
ERRNULLTABLENAMEMSG CONSTANT VARCHAR2(100) := 'A table name is required.'; 
USAGE    CONSTANT VARCHAR2(100) := '* USAGE: UTILS.GEN_CTL_FILE(tablename_in IN VARCHAR2, fieldsep_in VARCHAR2 DEFAULT ''|'')'; 
v_delim      VARCHAR2(20) := NVL(delim_in, '|'); 
err_nbr NUMBER; 
err_msg VARCHAR2(1000); 

CURSOR COL_CUR IS 
    SELECT COLUMN_NAME, 
    DECODE(COLUMN_ID, 1, ' ', ',') || RPAD(COLUMN_NAME, 32) || case upper(v_delim) 
    when 'FIXED' then 'POSITION(99:99) ' 
    else NULL 
    end|| DECODE(DATA_TYPE, 
     'VARCHAR2', 'CHAR NULLIF(' || COLUMN_NAME || '=BLANKS)', 
     'CHAR', 'CHAR NULLIF(' || COLUMN_NAME || '=BLANKS)', 
     'FLOAT', 'DECIMAL EXTERNAL NULLIF(' || COLUMN_NAME || '=BLANKS)', 
     'NUMBER', DECODE(            DATA_PRECISION, 
     0, 'INTEGER EXTERNAL NULLIF (' || COLUMN_NAME || '=BLANKS)', 
     DECODE(DATA_SCALE, 0, 'INTEGER EXTERNAL NULLIF (' || COLUMN_NAME || '=BLANKS)', 'DECIMAL EXTERNAL NULLIF (' || COLUMN_NAME || '=BLANKS)')), 
     'DATE', 'DATE "MM/DD/YYYY" NULLIF (' || COLUMN_NAME || '=BLANKS)', 
     data_type) 
      AS COL_DATA 
    FROM USER_TAB_COLUMNS 
    WHERE TABLE_NAME = UPPER(tablename_in) 
    ORDER BY COLUMN_ID; 

BEGIN 

IF tablename_in IS NULL THEN 
    RAISE_APPLICATION_ERROR(ERRNULLTABLENAME, ERRNULLTABLENAMEMSG || CHR(10) || USAGE); 
END IF; 

DBMS_OUTPUT.PUT_LINE('--'); 
DBMS_OUTPUT.PUT_LINE('-- NOTE - When using DIRECT=TRUE to perform block inserts to a table,'); 
DBMS_OUTPUT.PUT_LINE('--  the table''s triggers will not be used! Plan accordingly to'); 
DBMS_OUTPUT.PUT_LINE('--  manually perform the trigger actions after loading, if needed.'); 
DBMS_OUTPUT.PUT_LINE('--'); 
DBMS_OUTPUT.PUT_LINE('OPTIONS (DIRECT=TRUE)'); 
DBMS_OUTPUT.PUT_LINE('UNRECOVERABLE'); 
DBMS_OUTPUT.PUT_LINE('LOAD DATA'); 
DBMS_OUTPUT.PUT_LINE('APPEND'); 
DBMS_OUTPUT.PUT_LINE('INTO TABLE ' || UPPER(tablename_in)); 
DBMS_OUTPUT.PUT_LINE('EVALUATE CHECK_CONSTRAINTS'); 
if upper(v_delim) != 'FIXED' then 
    DBMS_OUTPUT.PUT_LINE('FIELDS TERMINATED BY ''' || v_delim || ''' TRAILING NULLCOLS'); 
end if; 
DBMS_OUTPUT.PUT_LINE('('); 

-- The cursor for loop construct implicitly opens and closes the cursor. 
FOR COL IN COL_CUR 
LOOP 
    DBMS_OUTPUT.PUT_LINE(COL.COL_DATA); 
END LOOP; 
DBMS_OUTPUT.PUT_LINE(')' || CHR(10)); 

EXCEPTION 
WHEN OTHERS THEN 
    err_nbr := SQLCODE; 
    err_msg := SUBSTR(SQLERRM, 1, 1000); 
    -- if any error occurs, print the SQLCODE message. 
    DBMS_OUTPUT.PUT_LINE('ERROR: ' || err_nbr || ' occurred: ' || err_msg); 
END; -- GEN_CTL_FILE 
相关问题