2011-02-10 95 views
6

私の要件は、sqlplus操作の結果をシェルスクリプトの変数に格納することです。 私は.SHファイルにSQLPlusの結果をシェル変数に格納する方法

sqlplus 'user/pwd' @test.sql 

で、次の操作の結果を必要とする私はすでに

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

を試してみましたが、それは動作しません。

EDIT ::

私は

testvar=sqlplus foo/[email protected] @test.sql 

にそれを変更し、それは私が

で試してみました

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

語ります

と同じエラーが発生します。 それは罰金

+0

Bourneタイプのシェル(bashなど)では、シンタックスでは '='の前後のスペースは使用できません。 –

答えて

9

採用のバッククォート作品

sqlplus foo/[email protected] @test.sql 

以下のように私は、変数の代入せずにしようとすると:あなた

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

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

またはそれは構文目障りである必要がありますがsuperfluを制限するために適切なsql * plusコマンドを使用することを明確に知っているousの出力、はい? :)バックティッキングは出力の空白を崩壊させることに注意してください。

+1

"バックティッキングは出力の空白を崩壊させます" - そうではありません。末尾の改行を削除するだけです。また、 '$()'の使い方は古くなっていません。むしろ逆です。 –

+1

それは逆です:バッククォートは「古い学校」です。代入時に空白が失われることはありません。変数が引用符で囲まれていないと、出力時に失われます。 –

+0

はい、あなたは '$()'について正しくあります。私は実際に後で他のオプションを追加するために編集して、切り替えを忘れてしまいました。 – Xailor

1

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

13

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

testvar=`sqlplus -s foo/[email protected] <<EOF 
set pages 0 
set head off 
set feed off 
@test.sql 
exit 
EOF` 

-sスイッチは、すべてのヘッダー情報ときにSQLPLUS起動をオフにします。また、フィードバック、ヘッダー、およびページサイズを0にしたいと思っています。私は古いスクールなので、私はまだバックティックを使用しています。

+0

は、パラメータを渡す場合にベリファイを追加する必要があります – agonen

+0

ありがとうございます。私はこのような構文を探していた。私はSQLファイルを使いたくなかった。 –

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 

すべての変数が1行にあることが重要です。読み取りコマンドは、ループごとに各DB行を確実に読み取ることができるためです。

+0

@trenton-d-adams termout off - 端末への表示を意味しません。私はあなたがスプールコマンドを使用しない限り、それを残す方が良いと思います – agonen

関連する問題