2012です 2017.スクリプトは、前の千年紀からの不格好で壊れやすい二日酔いです。 Oracleには、PL / SQLで実行できるさまざまな機能に加えて、Javaストアド・プロシージャがあり、ジョブを開始するためのスケジューリングがあります。スキーマを作成または修正するためにDDLを実行する以外に、Oracleデータベース環境でスクリプトを実行する必要はほとんどありません。 DDLスクリプトでさえ、外部クライアント、おそらくTeamCityなどのビルドツールからトリガーする必要があります。
特に、PL/SQLプログラムからSQLスクリプトを実行しようとするとアーキテクチャ上の失敗と見なします。ストアドプロシージャでは実行できないスクリプトで何をしていますか?
ストアドプロシージャに入力を渡すことに関しては、それがパラメータの目的です。 PL / SQLは対話型ではないため、値を入力するためのクライアントが必要です。シナリオに応じて、これは非同期(ファイルまたはテーブルの値)または同期(SQL * Plus、SQL Developer、または特注のフロントエンドからストアドプロシージャを呼び出す)で実行できます。
そうは言っても、現実の世界では、データベースと外部OSの間に相互依存関係がある厄介なアーキテクチャを使用しています。では、何ができるでしょうか?
- シェルコマンドを実行するJavaストアドプロシージャを記述できます。これは、Oracle8i以来存在してきた由緒あるソリューションです。詳細をご覧ください。
- 10g Oracleでは、DBMS_JOBをDBMS_SCHEDULERに置き換えます。このツールの機能強化の1つは、外部ジョブ、つまりシェルスクリプトを実行する機能です。詳細をご覧ください。
- Oracle 11g R1の外部テーブルはプリプロセッサスクリプトをサポートしているため、テーブルをクエリする前にシェルコマンドを実行します。詳細をご覧ください。
これらのオプションはすべて、昇格されたアクセスを要求することに注意してください(DIRECTORYオブジェクトの付与、セキュリティクレデンシャルなど)。これらは、特権ユーザー(つまり、DBA)のみが付与できます。データベースのセキュリティ構成が驚くほど緩い場合を除いて、PL/SQLから任意のシェルスクリプトを実行する方法はありません。
最後に、PL/SQLでSQLスクリプトを実行することでどのようなメリットが期待できるかは明確ではありません。 PL / SQLはデータベースサーバー上で実行されるため、クライアントマシンでスクリプトを表示できないことを忘れないでください。 。これは、ユーザー入力を受け入れるという要件に照らして関連しているようです。
おそらく最も簡単な解決策は、元のスクリプトの再構成です。必要なPL/SQL呼び出しをブロックに分割してから、名前付きスクリプトを呼び出すだけです。
begin
proc(para1,para2);
end;
/
@prompt1.sql