Как сохранить результат из SQLPlus в переменную оболочки

мое требование-сохранить результат операции sqlplus в переменную в моем скрипте оболочки. Мне нужен результат следующей операции, которая находится в моем .sh file

sqlplus 'user/pwd' @test.sql

Я уже пробовал

testvar = 'sqlplus 'user/pwd'
@test.sql'

но это не сработает.

EDIT::

Я изменил его на

testvar=sqlplus foo/bar@SCHM @test.sql

и говорит

SQL*Plus:: not found [No such file or directory]

Я пытался с

testvar=$(sqlplus foo/bar@SCHM
@test.sql)

и это дает та же ошибка. Когда я пытаюсь без назначения переменной, как показано ниже

sqlplus foo/bar@schm @test.sql

он работает

4 ответов


использовать backticks:

testvar=`sqlplus foo/bar @test.sql`

или это должно быть синтаксическое бельмо на глазу:

testvar=$(sqlplus foo/bar @test.sql)

вы четко знаете, чтобы взять правильные команды sql * plus, чтобы ограничить лишний выход, да? :) и конечно остерегайтесь backticking рухнет пробелов в выходной.


попробуйте это вместо этого:

testvar=`sqlplus -s foo/bar@SCHM <<EOF
set pages 0
set head off
set feed off
@test.sql
exit
EOF`

-s выключит всю информацию заголовка при запуске sqlplus. Вы также хотите отключить обратную связь, заголовки и размер страницы до 0. Я старая школа, поэтому я все еще использую задние тики:)


Как команды $() выполняются в подрешетке, убедитесь, что у вас есть все необходимое для вызова экспорта sqlplus. Прямо сейчас вы, очевидно, наткнулись на PATH вопрос.


решения здесь все хаки.

ваш файл sql должен выглядеть так...

set termout off
set showmode off
set heading off
set echo off
set timing off
set time off
set feedback 0
set pagesize 0
set embedded ON
set verify OFF

spool courses.sh
SELECT 'term="' || sfrstcr_term_code || '";', 'subj="' || sfrstcr_subj_code || '";' FROM sfrstcr WHERE sfrstcr_pidm = 1234567;
spool off

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

while read -r row; do
  eval "$row"
  echo "term=$term"; 
  echo "subj=$subj"; 
done < courses.sh

важно, чтобы все переменные находились в одной строке, так как команда read гарантирует, что вы можете прочитать каждую строку DB за цикл.