208

今週、私の会社では、SQL スクリプトをどのように記述すべきかについて議論がありました。

背景: 私たちのデータベースは Oracle 10g です (まもなく 11 にアップグレードします)。DBA チームは、スクリプトを本番環境にデプロイするために SQLPlus を使用しています。

最近、セミコロンとスラッシュ ( /) の両方を使用したために失敗したデプロイがありました。セミコロンは各ステートメントの終わりにあり、スラッシュはステートメントの間にありました。

alter table foo.bar drop constraint bar1;
/
alter table foo.can drop constraint can1;
/

後でスクリプトにいくつかのトリガーが追加され、いくつかのビューが作成され、いくつかのストアド プロシージャが作成されました。;theと the の両方を使用すると、/各ステートメントが 2 回実行されてエラーが発生します (特に、一意である必要がある挿入で)。

SQL Developer では、これは起こりません。TOAD では、これは起こりません。特定のコマンドを実行すると、コマンドがないと機能しません/

PL/SQL では、サブプログラム (DECLARE、BEGIN、END) がある場合、使用されるセミコロンはサブプログラムの一部と見なされるため、スラッシュを使用する必要があります。

私の質問は次のとおりです。データベースが Oracle の場合、SQL スクリプトを記述する適切な方法は何ですか? DB が Oracle であることはわかっているので、常に/?を使用する必要があります。

4

8 に答える 8

368

これが古いスレッドであることは知っていますが、偶然見つけたばかりで、完全に説明されていないと感じています.

/SQL*Plus では、aと a の動作が異なるため、これらの意味には大きな違いがあります;

;SQL ステートメントを終了します/が、 は現在の「バッファ」にあるものは何でも実行します。したがって、 a と a を使用すると; /ステートメントは実際には 2 回実行されます。

/ステートメントの実行後にを使用すると、次のように簡単に確認できます。

SQL*Plus: Release 11.2.0.1.0 Production on Wed Apr 18 12:37:20 2012

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

Connected to:
Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - Production
With the Partitioning and OLAP options

SQL> drop table foo;

Table dropped.

SQL> /
drop table foo
           *
ERROR at line 1:
ORA-00942: table or view does not exist

この場合、実際にエラーに気付きます。


ただし、次のような SQL スクリプトがあると仮定します。

drop table foo;
/

そして、これは SQL*Plus 内から実行されるため、非常に混乱します。

SQL*Plus: Release 11.2.0.1.0 Production on Wed Apr 18 12:38:05 2012

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


Connected to:
Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - Production
With the Partitioning and OLAP options

SQL> @drop

Table dropped.

drop table foo
           *
ERROR at line 1:
ORA-00942: table or view does not exist

主に、 、、 などのステートメント /が埋め込まれたステートメントを実行するために、および任意のブロックに対して必要です。;CREATE PROCEDURECREATE FUNCTIONCREATE PACKAGEBEGIN...END

于 2012-04-18T10:40:08.103 に答える
110

;と の間の使用法をもう少し明確にしたかったのです。/

SQLPLUS では:

  1. ;「現在のステートメントを終了し、実行して、SQLPLUS バッファーに格納する」ことを意味します。
  2. <newline>DML (SELECT、UPDATE、INSERT、...) ステートメントまたは一部のタイプの DDL (Creating Tables and Views) ステートメント ( を含まない;) の後、つまり、ステートメントをバッファーに格納しますが、実行はしません。
  3. /ステートメントをバッファに入力した後 (空白を<newline>使用) は、「バッファ内で DML または DDL または PL/SQL を実行する」ことを意味します。
  4. RUNまたはR、バッファ内の SQL を表示/出力して実行する sqlsplus コマンドです。SQL ステートメントは終了しません。
  5. /DMLまたはDDLまたはPL/SQLの入力中は、「現在の文を終了し、実行してSQLPLUSバッファに格納する」ことを意味します

注: PL ;/ ;SQL ブロック全体を完全にバッファしてから実行します。PL/SQL ブロックは次で終了する必要があります。

END;
/
于 2014-01-15T18:16:57.560 に答える
32

好みの問題ですが、一貫してスラッシュを使用するスクリプトを見るのが好きです。このようにして、作業のすべての「単位」(PL/SQLオブジェクトの作成、PL/SQL無名ブロックの実行、およびDML文の実行)を実行できます。目で見つけやすくなりました。

また、最終的にデプロイ用に Ant のようなものに移行すると、一貫したステートメント区切り文字を持つようにターゲットの定義が簡素化されます。

于 2009-07-03T17:12:25.697 に答える
23

ほとんどすべての Oracle デプロイメントは、SQL*Plus (DBA が使用する奇妙な小さなコマンド ライン ツール) を介して行われます。また、SQL*Plus では、単独のスラッシュは基本的に「直前に実行した SQL または PL/SQL コマンドを再実行する」ことを意味します。

見る

http://ss64.com/ora/syntax-sqlplus.html

経験則では、スラッシュを使用できるものBEGIN .. ENDまたは使用できる場所で使用しますCREATE OR REPLACE

独自の使用が必要なインサート用

INSERT INTO my_table ()
SELECT <values to be inserted>
FROM dual
WHERE NOT EXISTS (SELECT 
                  FROM my_table
                  WHERE <identify data that you are trying to insert>)
于 2009-07-21T19:04:21.020 に答える
16

私の理解では、すべてのSQLステートメントは、DDL、DML、DCL、およびTCLステートメントを含め、セミコロンの終わりで自動的に実行されるため、スラッシュは必要ありません。

プロシージャ、関数、パッケージ、トリガーなどの他のPL / SQLブロックの場合、これらは複数行のプログラムであるため、Oracleはブロックをいつ実行するかを知る方法が必要です。そのため、各ブロックの最後にスラッシュを書き込む必要があります。 Oracleに実行させます。

于 2012-06-26T15:48:43.807 に答える
0

各スクリプトの最後にスラッシュを 1 回だけ使用して、これ以上コード行がないことを sqlplus に伝えます。スクリプトの途中では、スラッシュを使用しません。

于 2009-07-03T16:11:35.830 に答える