2015-10-09 5 views
0

используя sql-загрузчик, я знаю, что могу ссылаться на переменную ksh в моем файле ctl. Например, я могу написатьПоложите результат выбора в переменную ksh

LOAD DATA 
    INFILE '$PATH_IN_KSH/my_file.dat' 
... 

Я хотел бы добавить, КОГДА пункт как этот

WHEN (125:125) = '$P_NUMBER' 

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

Возможно ли это? получить значение из столбца с помощью select и как-то поместить его в переменную ksh, чтобы файл ctl мог ее видеть. (Что-то с SQL плюс?)

Спасибо

+0

[This] (http://stackoverflow.com/a/17731960/266304) немного сложнее, чем это должно быть - вам действительно не нужна функция, но это не мешает иметь разделение , Это дает вам то, что вам нужно? –

+0

Напишите сценарий оболочки для управления этим процессом. Внутри сценария либо используйте ЗДЕСЬ DOC для файла управления sqlldr и ссылочных оболочек vars, либо иметь управляющий файл как отдельный файл шаблона и запускать sed, чтобы заменить переменную значениями. – TenG

+0

@Alex Poole .. Да, кажется, все хорошо – mlwacosmos

ответ

0

В качестве основного контура вы можете запустить SQL * Plus с Heredoc для выполнения запроса и назначить выход переменной:

P_NUMBER=`sqlplus -s /nolog <<!EOF 
connect username/password 
whenever sqlerror exit failure 
set pagesize 0 
set feedback off 
select your_value from your_table where your_key = 'something'; 
exit 0 
!EOF` 

Привязка к backticks присваивает результат переменной. $ P_NUMBER будет удерживать любое значение, полученное вашим запросом (или сообщение об ошибке, если учетные данные были неправильными, скажем). Это помогает, если вы уверены, что запрос вернет ровно один результат. Вы также можете проверить код возврата с $?, чтобы искать ошибки, прежде чем пытаться использовать свою переменную.

В том числе -s флаг, выключая обратной связи и установив размер страницы к нулю коллективно подавить все шумы, так что вы получите только результат и не должны удалить баннеры, заголовки и т.д.

И, наконец, я ve использовал /nolog и положил оператор connect внутри heredoc, чтобы учетные данные не отображались в списке процессов, что часто игнорируется. Если вы не хотите этого делать и введите учетные данные как sqlplus username/passwd, вы можете добавить флаг -l, чтобы он только пытался войти в систему один раз; в противном случае, если сбой входа в систему по какой-либо причине, он попытается использовать остальную часть heredoc в качестве дополнительных учетных данных и может показаться, что он зависает с короткими сценариями.