Нет, вы не можете передать переменную в командной строке или через окружение. Параметр командной строки не для передачи произвольных значений, а управляющий файл не распознает ссылки на переменные среды.
Лучшее, что вы могли бы сделать, я думаю, это иметь управляющий файл шаблона с заполнителями, в котором вы хотите использовать значения переменных, а затем сгенерировать ваш реальный управляющий файл из шаблона, заменяя ваши переменные по мере их создания (например, с помощью sed
).
Допустим, ваша таблица состоит из трех столбцов, трех столбцов, и для простоты вам нужны значения по умолчанию для двух из них: одна строка и одно число. Вы можете иметь файл с именем template.ctl
, который включает в себя:
...
fields terminated by ','
trailing nullcols
(
id,
col2 "nvl(:col2, '<DEFAULT_STR>')",
col3 "nvl(:col3, <DEFAULT_NUM>)"
)
Затем в вашем сценарии оболочки (жестко запрограммируйте текущие значения по умолчанию, поскольку вы еще не сказали, откуда они будут поступать):
DEFAULT_STR="Some value"
DEFAULT_NUM=42
sed -e "s/<DEFAULT_STR>/${DEFAULT_STR}/" \
-e "s/<DEFAULT_NUM>/${DEFAULT_NUM}/" \
template.ctl > real.ctl
sqlldr usr/pwd control=real.ctl file=...
real.ctl
будет создан с заменой фактических значений по умолчанию:
...
fields terminated by ','
trailing nullcols
(
id,
col2 "nvl(:col2, 'Some value')",
col3 "nvl(:col3, 42)"
)
поэтому, когда вы запускаете SQL * Loader, он будет использовать эти значения по умолчанию.
Если бы вы могли запускать это несколько раз одновременно, вы могли бы сделать «реальное» имя управляющего файла уникальным, например, добавив текущий идентификатор процесса оболочки.
Другим вариантом является загрузка в промежуточную таблицу, которая допускает нулевые значения, а затем заполнение вашей реальной таблицы из промежуточной таблицы - применение преобразования для нулевых значений к их значениям по умолчанию в этой точке с использованием позиционных параметров, передаваемых в SQL * Plus, как часть того же сценария оболочки.
В вашем сценарии оболочки вызовите SQL * Loader, но с управляющим файлом, указывающим на промежуточную таблицу:
sqlldr usr/pwd control=stage.ctl file=...
затем вызовите SQL * Plus, либо к сценарию, который принимает позиционные параметры к значениям по умолчанию, либо к встроенному, поскольку это довольно просто; снова, скажем, у ваших таблиц есть три столбца, и вы хотите значения по умолчанию для двух из них, одной строки и одного числа для простоты:
DEFAULT_STR="Some value"
DEFAULT_NUM=42
sqlplus -l -s usr/pwd <<!EOF
whenever sqlerror exit failure rollback
insert into real_table (id, col2, col3)
select id, nvl(col2, '${DEFAULT_STR}'), nvl(col3, $DEFAULT_NUM)
from staging_table;
commit;
exit;
!EOF
(не проверено, но, надеюсь, дает вам суть!)