2017-06-23 129 views
2

SQL * Developerで面白い動作が発生しました。私は試験の準備をしているので、セミコロンの要件に関するいくつかの不一致を理解したいと思います。なぜOracle SQLコマンドの後にセミコロンを使用する必要はありませんか?

ご存知のように、ドキュメントのOracle DBは、セミコロンの使用法と終了文について非常に厳しいようです。しかしコマンドの中にはセミコロンをまったく必要としないものもあります。 それはなぜですか?

DML: - セミコロンを持っている必要があります:

SELECT .... FROM ...; -- has to have a semicolon 
CREATE TABLE x (...); -- has to have a semicolon 

TCL: - セミコロンを必要としない:

SAVEPOINT 
ROLLBACK 

SQL * Plusを:

DESC TABLE tab1 -- does not require semicolons. 

をなぜそれは一貫していません(少なくともSQL * Developerでは)、ここでのルールは何ですか?

+1

SQL文は常に ';'を必要とします( 'savepoint'と' rollback'も同様です)。これもSQL標準で定義されています。 'DESC'はSQL文ではなく、SQLクライアントによって提供されるユーティリティ文です。複数の行に渡すことができないため、終了文字を持つ必要はありません。 –

+1

@a_horse_with_no_name - 私はそれが当てはまるとは思わない。私が知る限り、SQL標準によれば、SQL文にはターミネータはありません。また、SQL開発者は、セミコロンなしで完全なSQL文を選択して実行することができます。セミコロンは、SQL * PlusやSQL Developerなどのインタフェース・ユーティリティによって使用され、SQL文が終了する場所を決定します。SQL文は、スクリプト内にあっても一度に1つだけサーバに送信できるためです。実際、カタログに保存されているSQL文のテキストをチェックすると、最後にセミコロンはありません。 – mathguy

+0

"SQL入力ウィンドウに複数のSQLステートメントがある場合を除き、"セミコロンが必要です。 "は真です。それを試してみてください:入力ウィンドウをクリアし、 'select * from dual'(セミコロンなし)と入力して、CTRL + ENTERを押して実行してください。ステートメントがセミコロンなしで実行されていることがわかります。 1つ以上のSQL文を入力します。たとえば、 'select count(*)from dual'を入力します。ウィンドウ内のすべてを選択してCtrl + Enterキーを押すと、エラーが発生します。しかし、2つのステートメントのうち1つだけを選択して実行すると、問題なく動作します。 – mathguy

答えて

6

フロントエンドはコマンド自体ではなく、要件を駆動します。 (ドキュメントをチェックアウトしている場合は、コマンドの構文ダイアグラムでそのドキュメントを見つけることはできません。)以下ではSQL * Plusに焦点を当てます。 SQL * Developerは類似している可能性がありますが、例の中には少なくとも1つの違いがあります。

データベースで処理されるコマンドの多くは、複数の行にまたがる可能性があります。そのため、sqlplusは、SQL文の入力が完了した時点でセミコロンを指標として使用します(セミコロンを終了しません) )。これは、DML(SELECT)、DDL(CREATE TABLE)、& TCL(SAVEPOINTROLLBACK)の例です。同じことをするためにスラッシュだけの行を使うことも、 "。"以外の行を使うこともできます。ステートメントを終了しますが、データベースには送信しません。

対照的に、sqlplus DESCDESCRIBE)のようなコマンドは、データベースの代わりにフロントエンド自体に向けられています。このような場合、フロントエンドは、セミコロンで明示的に終了することなく、フロントエンドが単一行コマンドのみを認識するため、認識して処理するほどスマートです。 (私は " - "で終わる行を数えずに次の行に移ります)

PL/SQLはもう一つのワックスです:その中のステートメントはセミコロンで終わっていますので、sqlplusがplsqlブロックを開始すると、通常のセミコロンの動作は抑止され、 "/"または "。"を使用する必要があります。ブロックを終了する。

関連する問題