私の要件は、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
それはうまくいきます
バックティックを採用する:
testvar=`sqlplus foo/bar @test.sql`
またはそれは構文上の目障りなものでなければなりません:
testvar=$(sqlplus foo/bar @test.sql)
余分な出力を制限するために正しいsql * plusコマンドを実行することを明確に知っていますか? :)そしてもちろん、バックティックは出力の空白を折りたたむことに注意してください。
代わりにこれを試してください:
testvar=`sqlplus -s foo/bar@SCHM <<EOF
set pages 0
set head off
set feed off
@test.sql
exit
EOF`
-sスイッチは、sqlplusの起動時にすべてのヘッダー情報をオフにします。また、フィードバック、ヘッダー、ページサイズを0にオフにします。私は古い学校なので、まだバックティックを使用しています:)
ここでの解決策はすべてハックです。
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行にあることが重要です。
$()
内のコマンドはサブシェルで実行されるため、sqlplusの呼び出しに必要なものがすべてエクスポートされていることを確認してください。今、あなたは明らかにPATH
の問題に遭遇しました。