1

以下に、sqlplus で実行しようとしている SQL スクリプトのテンプレートを示します。

WHENEVER SQLERROR EXIT 1 ROLLBACK
WHENEVER OSERROR EXIT 1 ROLLBACK

BEGIN
 -- Doing some Insert
END;
/

INSERT INTO TMP_TABLE VALUES('A', 'B')

COMMIT;
QUIT;
/

このスクリプトは、ローカル システムのファイル (Test1.sql) で使用できます。Windows コマンド ライン コンソールから Oracle に接続して、このクエリを実行しています。cmd で以下の行を入力します。

C:\Users\myself> sqlplus UNAME/PWD@//DB IP:PORT/SID @C:\Users\Test1.sql

(INSERT INTO...)SQL スクリプトでは、意図的に 1 つのステートメントをセミコロンで終了しませんでした (上記を参照)。上記の手順に従ってこのスクリプトを実行すると、プログラムが正常に実行され、メッセージが出力されます。

SQL*Plus: Release 10.2.0.1.0 - Production on Fri Apr 6 16:50:19 2012

Copyright (c) 1982, 2005, Oracle.  All rights reserved.


Connected to:
Oracle Database 11g Enterprise Edition Release 11.2.0.2.0 - 64bit Production
With the Partitioning, Automatic Storage Management, OLAP, Data Mining
and Real Application Testing options


PL/SQL procedure successfully completed.


Commit complete.

Disconnected from Oracle Database 11g Enterprise Edition Release 11.2.0.2.0 - 64
bit Production
With the Partitioning, Automatic Storage Management, OLAP, Data Mining
and Real Application Testing options

SQL Navigator ツールで同じ一連のスクリプトを実行すると、以下のエラーが表示されますが、それは正しいです。

[10]: (エラー): ORA-00933: SQL コマンドが正しく終了していません

スクリプトがこのエラーを報告せず、代わりに「コミット完了」などのメッセージを表示する理由がわかりません。

Windows コマンド コンソールを使用して sdlplus を介して同じスクリプトを実行しようとしているときに、コンソールでこのエラーをスローするスクリプトを作成する方法を教えてください。

4

1 に答える 1

3

私の理解では、sqlplus スクリプトでは、空白行が sql ステートメントを終了します。テストする Oracle 環境はありませんが、insert ステートメントと commit ステートメントの間の空白行を削除して、エラーが発生するかどうかを確認してください。私はあなたがそれを見るだろうと想像します(それは連結されたinsert..commitステートメントとして機能します)。

SQL Plusリファレンスのコマンドの実行セクションを見てください

具体的には:

SQL コマンドの終了

次の 3 つの方法のいずれかで SQL コマンドを終了できます。

  • セミコロン (;)
  • 単独の行にスラッシュ (/) を付ける
  • 空行あり

注意 : SET SQLBLANKLINES コマンドを使用して、SQL 文での空白行の表示方法と動作を変更できます (iSQL*Plus では変更できません)。空白行の動作の変更について詳しくは、SET コマンドを参照してください。

SQLNavigator に関しては、クライアント ツールが異なれば動作も異なります。SQLNavigator インタープリターは、sqlplus インタープリターと同じように動作しません。スクリプトの問題で Oracle サポートに電話すると、最初に「sqlplus で実行したときにこのエラーが表示されますか?」と尋ねられます。

于 2012-04-06T23:38:46.670 に答える