Есть отличная дока по созданию переносного клиента для работы с БД Oracle обладающая более широким функционалом, чем предлагаемый родной Oracle Instant Client. На странице 21 документа автору удается запустить sqlldr, но, поскольку утилита создана не для вывода справки о том, как с ней работать, а для работы с базой, этим реальная настройка не заканчивается, в связи с чем пишу очередное исследование на тему как скрестить sqlldr с oracle instant client.
CREATE TABLE BLOB_TEST.EMP(empno NUMBER, empname VARCHAR2(64), sal NUMBER, deptno NUMBER);
Создаём файл tst.lst со следующим содержимым:
10001,"Scott Tiger", 1000, 40
10002,"Frank Naude", 500, 20
Создаём файл tst.ctl со следующим содержимым:
LOAD DATA
CHARACTERSET UTF8
INFILE 'tst.lst'
APPEND
INTO TABLE BLOB_TEST.EMP
FIELDS TERMINATED BY ',' optionally enclosed by '"'
( empno, empname, sal, deptno )
Итак, сценарий 1. Загружаем строки и числа.
Целевая таблица:CREATE TABLE BLOB_TEST.EMP(empno NUMBER, empname VARCHAR2(64), sal NUMBER, deptno NUMBER);
Объявляем переменную окружения ORACLE_HOME=путь_к_Instant_Client (для краткости назову директорию oic) и NLS_LANG=AMERICAN_AMERICA.UTF8.
Создаём в oic директорию rdbms/mesg, куда переписываем файл ulus.msb.
Для клиента под linux x32 этого достаточно, для клиента под linux x64 необходимо дополнительно прописать LD_LIBRARY_PATH=путь_к_Instant_Client.
Для клиента под linux x32 этого достаточно, для клиента под linux x64 необходимо дополнительно прописать LD_LIBRARY_PATH=путь_к_Instant_Client.
К этому моменту имеем то, что описано в доке, ссылка на которую дана в начале (за исключением переменных окружения, но они, как покажет практика, для работы sqlldr не нужны).
Создаём файл tst.lst со следующим содержимым:
10001,"Scott Tiger", 1000, 40
10002,"Frank Naude", 500, 20
Создаём файл tst.ctl со следующим содержимым:
LOAD DATA
CHARACTERSET UTF8
INFILE 'tst.lst'
APPEND
INTO TABLE BLOB_TEST.EMP
FIELDS TERMINATED BY ',' optionally enclosed by '"'
( empno, empname, sal, deptno )
Итого имеющаяся структура:
/home/oracle/oic/...
/home/oracle/tst.lst
/home/oracle/tst.ctl
ORACLE_HOME=/home/oracle/oic
NLS_LANG=AMERICAN_AMERICA.UTF8
Текущая директория:
$pwd
/home/oracle
Проверяем, что никакие другие модули sqlldr не могут быть использованы:
$which sqlldr
/usr/bin/which: no sqlldr in (...)
Проверяем, что наш sqlldr запускается корректно:
$ ./oic/sqlldr
SQL*Loader: Release 11.2.0.2.0 - Production on Mon Dec 9 23:46:27 2013
Copyright (c) 1982, 2009, Oracle and/or its affiliates. All rights reserved.
Usage: SQLLDR keyword=value [,keyword=value,...]
...
На данный момент мы "убедились", что sqlldr работает так же, как указано в вышеуказанной доке. Дальше нас ждёт разочарование :)
$./oic/sqlldr system/oracle@localhost:1521/orcl tst.ctl
SQL*Loader-704: Internal error: ulconnect: OCIEnvCreate [-1]
А раз так, значит работа по скрещиванию Oracle Instant Client и sqlldr не завершена.
Создаём в oic директорию oracore/zoneinfo, куда из полного клиента переписываем файл timezlrg_1.dat:
$mkdir -p oic/oracore/zoneinfo
$cp /home/oracle/ora_full_client/oracore/zoneinfo/timezlrg_1.dat /home/oracle/oic/oracore/zoneinfo/
Первый барьер пройден, теперь при запуске sqlldr получаем ошибку:
SQL*Loader-266: Unable to locate character set handle for UTF8.
Если из tst.ctl убрать явное указание кодировки, будет аналогичная ошибка, но с соответствующей настройкам кодировке. Например:
SQL*Loader-282: Unable to locate character set handle for character set ID (873).
Если в системе задан NLS_LANG, будет другая ошибка:
SQL*Loader-128: unable to begin a session
Error while trying to retrieve text for error ORA-12705
В общем веселуха. Но поскольку проблема подключения к базе осталась, продолжаем процесс скрещивания - создаём директорию nls/data, куда перебрасываем файлы lx00001.nlb,lx10001.nlb, lx1boot.nlb, lx20001.nlb, lx200ab.nlb, lx20367.nlb, lx20369.nlb:
$mkdir -p oic/nls/data
$cp /home/oracle/ora_full_client/nls/data/lx00001.nlb /home/oracle/oic/nls/data/
$cp /home/oracle/ora_full_client/nls/data/lx10001.nlb /home/oracle/oic/nls/data/
$cp /home/oracle/ora_full_client/nls/data/lx1boot.nlb /home/oracle/oic/nls/data/
$cp /home/oracle/ora_full_client/nls/data/lx20001.nlb /home/oracle/oic/nls/data/
$cp /home/oracle/ora_full_client/nls/data/lx200ab.nlb /home/oracle/oic/nls/data/
$cp /home/oracle/ora_full_client/nls/data/lx20367.nlb /home/oracle/oic/nls/data/
$cp /home/oracle/ora_full_client/nls/data/lx20369.nlb /home/oracle/oic/nls/data/
Этого набора достаточно для работы sqlldr с параметрами language = AMERICAN, territory = AMERICA.
Проверяем:
$export NLS_LANG=AMERICAN_AMERICA.UTF8
$./oic/sqlldr system/oracle@localhost:1521/orcl tst.ctl
SQL*Loader: Release 11.2.0.2.0 - Production on Tue Dec 10 02:48:54 2013
Copyright (c) 1982, 2009, Oracle and/or its affiliates. All rights reserved.
Commit point reached - logical record count 1
Commit point reached - logical record count 2
Алилуйя! Получилось!
Теперь проверим сценарий 2. Загружаем файлы.
Меняем содержимое tst.lst на:
files/atis_armenia_201201.jpg
"files/ARMENIA 4_0 SLOVAKIA HRAPARAK 7.09.2011.flv"
Содержимое tst.ctl:
LOAD DATA
INFILE 'tst.lst'
APPEND
INTO TABLE BLOB_TEST.LOADME
FIELDS TERMINATED BY ',' optionally enclosed by '"'
(filename FILLER CHAR(100),
fileb LOBFILE(filename) TERMINATED BY EOF)
Целевая таблица
create table BLOB_TEST.LOADME(fileb BLOB, created DATE default SYSDATE);
Создаём директорию files, куда заливаем файлы atis_armenia_201201.jpg и ARMENIA 4_0 SLOVAKIA HRAPARAK 7.09.2011.flv.
Итого имеющаяся структура:
/home/oracle/oic/...
/home/oracle/files/ARMENIA 4_0 SLOVAKIA HRAPARAK 7.09.2011.flv
/home/oracle/files/atis_armenia_201201.jpg
/home/oracle/tst.lst
/home/oracle/tst.ctl
ORACLE_HOME=/home/oracle/oic
NLS_LANG=AMERICAN_AMERICA.UTF8
Запускаем sqlldr:
./oic/sqlldr system/oracle@localhost:1521/orcl tst.ctl
SQL*Loader: Release 11.2.0.2.0 - Production on Tue Dec 10 04:45:24 2013
Copyright (c) 1982, 2009, Oracle and/or its affiliates. All rights reserved.
Commit point reached - logical record count 1
Commit point reached - logical record count 2
Бинго! И заливка файлов работает. Итого, мы научили sqlldr работать в паре с Oracle Instant Client. Получилось с некоторыми ограничениями (nls_lang), но для моих задач полученный результат достаточен. Если вам требуется заточить sqlldr под другие значения языка и территории можно методом проб и ошибок найти тот необходимый набор файлов из .../nls/data, который требуется для работы, либо, как альтернативный вариант, переписать все файлы :)
Удачи!