Oracle SQLスクリプトを実行し、コマンドプロンプトでsqlplus.exeを終了します


114

Windowsコマンドプロンプト経由でSQL Plusを介してOracleスクリプトを実行したいと思います。スクリプトには「終了」コマンドは含まれていませんが、SQL Plusを終了して、スクリプトの完了時にコマンドプロンプトに制御を返すようにします。私の目標は、スクリプト変更せずにこれ行うことです。これは可能ですか?


これを「sqlplus .... <scriptname」または「sqlplus ... @scriptname」で実行していますか?私はあなたがUnix上で行うものに応じて異なる動作を見つけます。
runrig

回答:


140

別の方法は、バッチファイルでこのコマンドを使用することです。

echo exit | sqlplus user/pass@connect @scriptname

1
クール!「終了」がsqlplusセッションにどのように追加されるか知っていますか?

6
sqlplusコマンドはスクリプトを実行し、標準入力からさらにコマンドを読み取ろうとします。このパイプラインでは、標準入力からの読み取りでechoコマンドから文字列「exit」が読み取られ、sqlplusが終了します。
デイブ・コスタ

素晴らしい-これはまさに私が探していたものです。ありがとう!
JoshL

4
あなたは、UNIX上のプロセスへのリストをユーザー名のパスワードを公開することに注意してください(PS -ef)が、私はそれがWindows上で同じように動作し、ほぼ確信している
ロバートMerkwürdigeliebe

3
stackoverflow.com/questions/1639704/…およびdba.stackexchange.com/a/65064/16892は、コマンドラインでパスワードを使用する必要がないいくつかの方法を説明しています...
rogerdpack

13

私はこれが最善の解決策であることがわかり、端末またはスクリプト内で動作します:

echo @scriptname | sqlplus username/password@connect

1
これは技術的に質問に回答するかもしれませんが、実質的に他の回答の複製であり、付加価値はほとんどありません。また、これらのコマンドが何をしているのかを説明すれば、他の人にも役立ちます。ありがとうございました!
クリスS

5
これは私にとってはうまくいきましたが、「終了」を避けるため、一番上の答えよりもエレガントです。
ボグダンカルマック14

12

問題がsqlファイル自体にある可能性があることに気付いたら、sqlplusに終了するよう指示する必要があることを理解してください。私がこれを行う方法は次のとおりです。

デュアルから*を選択します。

終了する;
/

(スラッシュは重要です。これは、sqlplusにその上のstatemet(s)を実行するように指示します。)


Dave Costaの答えも機能することに注意してください:終了(または終了)をsqlplusコマンドにパイプします。

/トリックをありがとう、私はこの情報を探していました!

2
スラッシュは、SQLバッファーにあるものを実行することを意味します。複数のステートメントを実行することはなく、「quit」などのSQLPlus制御コマンドを実行する必要もありません。対話型のSQLPlusプロンプトで「quit」<Enter>と入力すると、すぐに終了します。
デイブ・コスタ

12

ユーザー情報と終了を非表示にする最良の方法は次のとおりです。

exit | sqlplus -S user/pwd@server @script.sql

exitsqlplusの出力に提供され、強制的に終了します。-Sスクリプト内のsqlクエリ以外のすべてのサーバー出力を抑制します。


2
sshを使用して終了する場合| 出口の代わりに| そのため、後でファイルを編集して終了したり終了したりしても、sshセッションが閉じられません。これは、ファイルも見つからない場合に機能します。
カールヘンセリン16

6

シェルスクリプトでこれを行うこともできます。

sqlplus /nolog <<EOF
connect user/pass
@run_some_file.sql
select * from dual;
EOF

「;」をエスケープする必要がある場合があります とともに \。


3

はい、可能です-SQLPlusを適切にセットアップし、スクリプト(つまり@YourTargetScript.sql)を含めてから終了するラッパースクリプトを生成します。

とはいえ、このアプローチはまったくお勧めしません。SQLPlusには、プログラムで使用するための非常に多くの落とし穴があります。過去にOracleを使用したシェルスクリプトを作成するときに、Pythonラッパーを構築しました(より合理的なエラー処理動作、stdout / stderr間の出力の健全な分離、ネイティブCSV出力サポート、およびその他のそのような機能を追加)。ずっといい。


他のプログラムでは、あなたに同意します。しかし、SQLPlusは、他の環境(私の場合はPerl / DBI / DBD :: Oracle)が提供しなかった不適切なクエリに関する有用なコンテキストを提供してくれました。注意深いエラー処理を行っている場合、それは苦痛の価値があります。

また、サーバーをどの程度制御できるかによって、シェルとSQLPlus以外のものを使用できると想定できる場合とできない場合があります。Solaris、HP / UX、AIXなどを実行している多くのunixショップでは、非常にベアインストールを使用しており、ボックスに他のものをインストールすることはできません。これに対する回避策は、アプリケーションに最小限のインタープリターをバンドルすることです。
ConcernedOfTunbridgeWells

3

このような:

sqlplus / nolog userid / password @ tnsname @filename

これをバッチファイルに入れた場合、制御は後続のステートメントで続行されます。

編集:私の悪い、/ nologフラグで再試行してください


残念ながら、これは機能しません。バッチファイルを実行すると、SqlPlusはコマンドプロンプトに制御を戻す代わりに、SQL>プロンプトでユーザー入力を待機します。
JoshL

申し訳ありませんが、これも機能しません。/ nologを使用すると、ログオンせずにsqlplusを起動できます。完了時にスクリプトを終了することとは関係ありません。
JoshL

うーん、私は環境の違いについて疑問に思っています。このようにsqlplusを使用する多数のバットスクリプトがあります。

クリス、実例を挙げていただけますか?「select * from dual」などを実行する単純なものです...私はあなたの提案を試すための例を作成しましたが、役に立ちません。これはWindows上にあることに注意してください。
JoshL

ジョシュ、以下の新しい答えをご覧ください。

1

スクリプトにパスワードを含めることのセキュリティが心配な方のために、AskTomには「外部で識別される」http://asktom.oracle.com/pls/apex/f?p = 100:11:0 ::::に関する記事があり ます。 P11_QUESTION_ID:142212348066


2
これは理論的には質問に回答するかもしれませんが、回答の重要な部分をここに含め、参照用のリンクを提供することが望ましいでしょう
スコットパック

0

SQLスクリプトにEXITを追加します。test.batファイルの例を次に示します。

sqlplus user / pwd @ server @ test.SQL> myLOG.LOG

私のtest.sqlファイルには次のものがあります:select * from dual; 出口


それは問題ありませんが、exit / quitステートメントを含めるようにスクリプトを変更せずにこれを行う要件を満たしていません。これらのスクリプトは、SQL PlusのDBAが実行できますが、バッチファイルからも実行できます。
JoshL 2009年

0

出口| SQLPLUS / @ @

これは正しい解決策です、私はそれが働いていることを試しました

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.