私はOracle DB 11g Enterprise Editionを持っていて、JavaコードからSQLスクリプトを実行したいのです。このSQLスクリプトを.sqlファイルから読んでいて、スクリプトにはcreate table
、create type
、 alter table
、drop type
、drop procedure
、insert into
、およびbegin
とend
を含む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;
何があなたの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 )
(例えば。
ALTER
、SELECT
、DROP
、GRANT
etc ..ステートメントはセミコロン;
で終わりますCREATE TABLESPACE
、CREATE USER
、CREATE TABLE
などのステートメントはセミコロン;
で終わりますCREATE PROCEDURE
、CREATE PACKAGE
、CREATE TRIGGER
などのステートメントはスラッシュ/
で終わりますDECLARE
、BEGIN
(匿名のpl/sqlブロック)ステートメントはスラッシュ/
で終わります)
よろしく
https://stackoverflow.com/questions/29961595/sql-server-go-equivalent-in-Oracle によると、 ";"および「/」は、SQL ServerのGOに相当するOracleです。特定の例では、これは「;」を含むことができるブロックなので、「/」で閉じる必要があります。ステートメントの場合、末尾に「/」を追加するとステートメントが繰り返されるため、次のようになります。
commit;
/
... 2つのコミットを行います。どちらがどれであるかを知る方法については、vegatripyの回答(+1)を参照してください。
で終わる各ステートメント/ブロックを分割することは可能ですか?それぞれ ストアドプロシージャ を作成しますか?
これにより、ミニスクリプトのように、各ストアドプロシージャをJavaから「関数」として直接呼び出すことができます。