Могут ли переменные быть переданы в управляющий файл SQL * Loader? - PullRequest
3 голосов
/ 21 сентября 2010

Предположим, у вас есть таблица:

CREATE TABLE Customer
(
  batch_id         NUMBER,
  customer_name    VARCHAR2(20),
  customer_address VARCHAR2(100)
)

И предположим, у вас есть контрольный файл для заполнения этой таблицы:

LOAD DATA INFILE 'customers.dat'
REPLACE

INTO TABLE Customer
(
  batch_id         ??????,
  customer_name    POSITION(001:020),
  customer_address POSITION(021:120)
)

Можно ли передать значение для batch_id в мой управляющий файл при запуске SQL * Loader? Например, можно ли указать переменную связывания (превратив знаки вопроса в :MY_AWESOME_BATCH_ID)?

Ответы [ 3 ]

7 голосов
/ 21 сентября 2010

Относительно простой способ архивирования, который заключается в создании хранимой функции, которая возвращает номер партии и использует его в файле загрузчика.

create or replace function getBatchNumber return number as
begin
  return 815;
end;
/

LOAD DATA INFILE 'customers.dat'
REPLACE

INTO TABLE Customer
(
  batch_id         "getBatchNumber",
  customer_name    POSITION(001:020),
  customer_address POSITION(021:120)
)
2 голосов
/ 21 сентября 2010

Не легко, если я правильно помню, но вот пара альтернатив:

  • Если будет только один процесс, выполняющий SQL Loader одновременно, используйте пустые значения или фиксированное значение, а затем запустите сценарий SQL Plus как часть процесса впоследствии, чтобы выполнить обновление последовательности значение.
  • Вызовите сценарий, который захватит следующее значение последовательности для вашего идентификатора партии, а затем выделит управляющий файл, включая константу batch_id.
1 голос
/ 19 мая 2012

Если допустимо, чтобы значения BATCH_ID генерировались автоматически при увеличении при каждой загрузке, тогда это сработало для меня.10-минутный интервал в образце должен быть скорректирован с учетом конкретной нагрузки - чтобы быть точным, загрузка должна завершиться в течение указанного интервала, и следующая загрузка не должна начинаться менее чем за указанное время.

Aнедостаток в том, что он заметно замедляется на больших объемах - это цена, на которой работает агрегат MAX на каждой строке.

LOAD DATA
...
INTO TABLE XYZ 
(
...
BATCH_ID expression "(select nvl(max(batch_id) + 1, 1) from extra_instruments_party_to where create_date < (sysdate - interval '10' minute))",
CREATE_DATE SYSDATE
)
...