web-dev-qa-db-ja.com

SQLPlusからの結果をシェル変数に保存する方法

私の要件は、sqlplus操作の結果をシェルスクリプトの変数に格納することです。 .shファイルにある次の操作の結果が必要です

sqlplus 'user/pwd' @test.sql

私はすでに試しました

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

しかし、それは機能しません。

編集::

に変更しました

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

それはうまくいきます

8
sarego

バックティックを採用する:

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

またはそれは構文上の目障りなものでなければなりません:

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

余分な出力を制限するために正しいsql * plusコマンドを実行することを明確に知っていますか? :)そしてもちろん、バックティックは出力の空白を折りたたむことに注意してください。

11
Jé Queue

代わりにこれを試してください:

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

-sスイッチは、sqlplusの起動時にすべてのヘッダー情報をオフにします。また、フィードバック、ヘッダー、ページサイズを0にオフにします。私は古い学校なので、まだバックティックを使用しています:)

19
Michael Ballent

ここでの解決策はすべてハックです。

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行を確実に読み取ることができるため、すべての変数が1行にあることが重要です。

1

$()内のコマンドはサブシェルで実行されるため、sqlplusの呼び出しに必要なものがすべてエクスポートされていることを確認してください。今、あなたは明らかにPATHの問題に遭遇しました。

1
user332325