46 управляющих файлов для загрузчика SQL

Мне нужно загрузить 46 таблиц с данными, используя SQL Loader для Oracle. Все файлы данных в формате CSV.

Порядок столбцов в CSV соответствует порядку столбцов в таблице.

Мне нужно создать управляющий файл для каждой таблицы.

Каков наилучший способ массового производства этих файлов?


person Raj More    schedule 22.09.2010    source источник
comment
Недостаточно данных — вы ничего не сказали нам о структуре загружаемого файла. Однако я скажу, что ALL_TAB_COLUMNS можно использовать очень интересным образом.   -  person Adam Musch    schedule 23.09.2010
comment
@Adam Musch все файлы данных в формате CSV   -  person Raj More    schedule 23.09.2010
comment
Слишком расплывчато. Например, соответствует ли порядок столбцов в CSV порядку столбцов в таблицах? Тем не менее, в SQL Developer есть опция ЭКСПОРТ ДАННЫХ В ЗАГРУЗЧИК, которая может генерировать файлы CTL.   -  person Gary Myers    schedule 23.09.2010
comment
Параметр «Экспорт данных в загрузчик» работает только с таблицами, в которых уже есть данные. Все мои столы сейчас пусты   -  person Raj More    schedule 23.09.2010


Ответы (2)


Я знаю, что это старый вопрос, но он все еще актуален. Для будущих искателей вот процедура, которую я добавил в наш служебный пакет, которая генерирует управляющий файл каркаса для таблицы. Передайте ему имя таблицы, и он выведет управляющий файл по умолчанию, который вы можете настроить там, где это необходимо. Возможно, сначала вам придется отредактировать его, чтобы он соответствовал вашим потребностям.

Звоните так:

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
person Gary_W    schedule 20.06.2014

Я делал нечто подобное (около 120 таблиц с более чем 1500 столбцами). Я использовал Excel (потому что мой рабочий результат - файл Excel).
Из макроса Excel я читаю мета таблицы из БД, как предложил Адам Муш, затем заполняю Таблицы.
Я думаю, что это сработает и для вас.
Или вы можете создать инструмент, используя знакомый вам язык, чтобы сделать то же самое.

person pinichi    schedule 07.10.2010