web-dev-qa-db-ja.com

Javaコードから実行するためにOracle SQLスクリプトから個々のSQLステートメントを分離する方法

私はOracle DB 11g Enterprise Editionを持っていて、JavaコードからSQLスクリプトを実行したいのです。このSQLスクリプトを.sqlファイルから読んでいて、スクリプトにはcreate tablecreate typealter tabledrop typedrop procedureinsert into、およびbeginendを含むpl/sqlブロック、およびそのようなすべての構成要素。

私の質問は、実行のために個々のSQLステートメントをJavaコードから分離する方法ですか?MS SQLでは、これらのSQLステートメントをGOキーワードで簡単に分離できますが、Oracle dbではそのようなセパレータはありません。通常、Oracle dbスクリプトでセパレータとして何が使用されますか?


たとえば、SQLスクリプトに他のSQLステートメントと共に次のcreateトリガーブロックがあるとします。ここに、SQLステートメントの終了チャーターとは見なせないセミコロンがあります(PL/SQLブロック自体に複数のセミコロンで区切られたステートメントを含めることができます)。これは、GOに似た;を使用できないことを意味します(MS SQLの場合)。

CREATE OR REPLACE TRIGGER SQLVersionHistory_SeqNum_TRG
   BEFORE INSERT 
   ON SQLVersionHistory
   FOR EACH ROW
   BEGIN
    :NEW.SequenceNumber := SQLVersionHistory_SeqNum.NEXTVAL;
   END;
5
Learner

何があなたのSQLスクリプトファイルを作成しますか? SQLスクリプトファイルの作成は変更可能ですか?

Sqlスクリプトファイルの作成を変更できる場合、最も簡単な方法は、ステートメント間のスクリプトに独自の区切り文字を追加することです。 (コメントは良い考えです)

そうでない場合、変更不可能なソースのプレーンテキストファイルで一連のsqlまたはpl/sqlステートメントを受け取っているだけの場合は、独自の解析アルゴリズムをコーディングする必要があります。 PL/SQLブロックには複数のSQLステートメントを含めることができるため、すべてのSQLステートメントはセミコロン(;)、butで終わることに注意してください。スラッシュ(/)だけで改行されます。

混乱を招く部分は、一部のSQLステートメントが実際にはCREATE PROCEDUREまたはCREATE TRIGGER(ドキュメントブック「Oracle®Database PL/SQL言語リファレンス」の完全なリスト)のように格納されたPL/SQLブロックであるということです。 http://docs.Oracle.com/cd/E11882_01/appdev.112/e25519/sqlstatements.htm#LNPLS99979

(例えば。

  • ALTERSELECTDROPGRANT etc ..ステートメントはセミコロン;で終わります
  • CREATE TABLESPACECREATE USERCREATE TABLEなどのステートメントはセミコロン;で終わります
  • CREATE PROCEDURECREATE PACKAGECREATE TRIGGERなどのステートメントはスラッシュ/で終わります
  • DECLAREBEGIN(匿名のpl/sqlブロック)ステートメントはスラッシュ/で終わります

よろしく

3
vegatripy

https://stackoverflow.com/questions/29961595/sql-server-go-equivalent-in-Oracle によると、 ";"および「/」は、SQL ServerのGOに相当するOracleです。特定の例では、これは「;」を含むことができるブロックなので、「/」で閉じる必要があります。ステートメントの場合、末尾に「/」を追加するとステートメントが繰り返されるため、次のようになります。

commit;
/

... 2つのコミットを行います。どちらがどれであるかを知る方法については、vegatripyの回答(+1)を参照してください。

1
Leigh Riffel

で終わる各ステートメント/ブロックを分割することは可能ですか?それぞれ ストアドプロシージャ を作成しますか?

これにより、ミニスクリプトのように、各ストアドプロシージャをJavaから「関数」として直接呼び出すことができます。

0
grimthaw