В качестве основного контура вы можете запустить 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 в качестве дополнительных учетных данных и может показаться, что он зависает с короткими сценариями.
[This] (http://stackoverflow.com/a/17731960/266304) немного сложнее, чем это должно быть - вам действительно не нужна функция, но это не мешает иметь разделение , Это дает вам то, что вам нужно? –
Напишите сценарий оболочки для управления этим процессом. Внутри сценария либо используйте ЗДЕСЬ DOC для файла управления sqlldr и ссылочных оболочек vars, либо иметь управляющий файл как отдельный файл шаблона и запускать sed, чтобы заменить переменную значениями. – TenG
@Alex Poole .. Да, кажется, все хорошо – mlwacosmos