Как сохранить результат из SQLPlus в переменную оболочки - PullRequest
8 голосов
/ 10 февраля 2011

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

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 ]

19 голосов
/ 16 февраля 2011

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

testvar=`sqlplus -s foo/bar@SCHM <<EOF
set pages 0
set head off
set feed off
@test.sql
exit
EOF`
Переключатель

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

10 голосов
/ 10 февраля 2011

Использовать обратные пометки:

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

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

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

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

1 голос
/ 20 февраля 2013

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

Ваш файл 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

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

1 голос
/ 11 февраля 2011

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

...