SQLとPL / SQLを区別する方法は?


16

質問は馬鹿げているように聞こえるかもしれませんが、この部分は理解できませんでした。

SQL * Plusは、SQLとPL / SQLの両方で機能します。一部のコードがSQLであるかPL / SQLであるかをどのようにして知ることができますか?私のコードにforループがある場合、それはもうSQLではありませんか?

PL / SQLは、ループ、条件などを含むSQLの拡張機能です。その後、SQLコードはデフォルトでPL / SQLコードですか?そうじゃない?

SQLとPL / SQLの間に境界はありますか?

この質問を引き起こしたb / w SQLとPL / SQLを区別する2つの例:

これら2つのcreate tableステートメントの違いは何ですか?

/programming/2267386/oracle-11g-varray-of-objects/2267813#2267813

回答:


12

確かに興味深い質問です。Oracle開発に精通しているほとんどの人は考えないでしょうが、あなたがそれに着いたとき、SQLとPL / SQLの境界を定義するのは時々混乱します。

頭字語の定義を見ることで、それぞれがどの機能領域をカバーしているかを把握し始めます。

SQL-構造化照会言語

PL / SQL-手続き言語/構造化照会言語

注意深い読者のかもしれない通知どのようにSQLショー二回8まで)SQLは、多くの場合、PL / SQL内に埋め込まれているためだこと- PL / SQLは、独自提供するために、作られた言語である第四世代言語(4GL)でデータベースオブジェクトと非常によく果たしていますオラクル。

ウィキペディアには、SQLPL / SQLの両方に関する非常に優れた資料があります。

紛らわしい部分は、PL / SQLとSQLが少し重複する部分です。SQLの範囲には、データの挿入、クエリ、更新、削除、いわゆるDML、またはデータ操作言語操作が含まれますが、DDLまたはデータ定義言語操作である作成、変更、名前変更、ドロップも含まれます。ここでは、一部の人が混乱するかもしれません。PL / SQLを使用して記述されたストアドプロシージャを作成する操作は、実際にはSQLです。SQLを使用して、PL / SQLのブロックを表すデータベースオブジェクトを作成します。

同様に、PL / SQL内にSQLコードを埋め込むことができます。たとえば、PL / SQLのFORループは、SQLクエリに基づくことができます。あなたの心を少し吹きます、え?実際にはSQLを内部的に使用してデータベースのレコードに対して何らかのアクションを実行するSQLを使用してプロシージャを作成します。

あなたが私に尋ねたらクールなもの。


2
実際、線はぼやけています。あなたはなど、それにSQL文を持つPL / SQL関数を呼び出すことで、SQL文を持つPL / SQLプロシージャを作成するためにSQL文を書くことができます
リーRiffel

1
@ウサギの穴を降りて行きます!
ScottCher

線がまったくぼやけていたとは言いません。PL / SQLは、SQLの手続き型ラッパーです。ほとんどのPL / SQLにはSQLステートメントが含まれていますが、必須ではありません。あなたは、実際のSQLカーソルトレースすることができますv$sqlなどを
ウィリアム・ロバートソン

12

包まれている場合

  • BEGIN ... END
  • DECLARE ... END
  • CREATE OR REPLACE ... END
  • 接頭辞が1行である EXECUTE

次に、PL / SQLです。これは内部で何を意味しますか?SQLはクエリプランに「コンパイル」されて実行され、イベントの結果セットSELECT、または他の場合に影響を受ける行数、またはエラーを即座に返します。ただし、PL / SQLはより複雑です。その中で参照されるすべてのオブジェクトの存在と必要な許可を確認し、PL / SQLをネイティブ近いコードにコンパイルします。これは、フルスピードで実行されます。依存関係が追跡され、テーブルが変更された場合、それを参照するPL / SQLを再コンパイルする必要があります。この理由は速度です。コンパイル時にすべてが事前に行われるため、PL / SQLでランタイムチェックを行う必要はありませんが、SQL文は毎回チェックする必要があります(thoのクエリプランもキャッシュされます、いわゆるソフト解析、権限を引き続き確認する必要があり、ソフト解析でもコストが関連付けられています)。

これは、Oracleが行うストアドプロシージャの「致命的な利点」の1つです。実際にPL / SQLストアドプロシージャまたはトリガーを実行すると、結果を得るために絶対的な最小量の計算が行われます。信頼されていないOracleカーネルの外部で実行されるアプリケーションコードは、データを取得するためにより多くのフープをジャンプする必要があります。これは、OCamlやHaskellなどの厳密に型指定された参照透過的な高レベル言語でも同じです。コンパイル時に一度だけ作業を行うと、コードが実行される数百万回のメリットを享受できます。


2
ミックスに追加するには、CALLはストアドプログラムユニットの実行に使用されるSQLステートメントであり、BEGIN ... ENDとしてボンネットの下に書き直されます
ゲイリー

2
EXECUTEであるとして、それはシンタックスシュガーです
ガイウス

5

SQLとPL / SQLの間に境界はありますか?

SQLは標準*です。

PL / SQLは、SQL標準*に対するベンダー拡張です。

* SQLは、その文法が実装されるべきであるかの明示的な文法やルールを持っている言語である、とされ ていないが 、標準 それ自体はただし、誰もが同意できる言語仕様があるため、プログラムがSQLのみで記述されていれば、SQLで記述されたものはすべて移植可能です。

ただし、PL / SQLはベンダー拡張であるため、他のベンダーがサポートしていない言語部分が含まれます。


3
PL / SQLは事実上の標準であり、SQLはデジュール標準であると言えます:
Gaius

3
@Gaiusとその文だけから、私は2つのことを推測します。あなたはORA開発者であり、TSQLは単に厄介だと思うでしょう:p
jcolebrand

@jcolebrand最初のDBAの仕事は実際にはSybaseでしたが、そうですね、最近は主にOracleで働いています。どちらのデータベースでもT-SQLまたはPL / SQLのいずれかを作成できれば幸いですが、言語はプラットフォームを反映します(たとえば、SQL Serverとその子孫ではカーソルとロックが高価であるため、T-SQLがそうです) 、そしてPL / SQLは、Oracleの誰かが最後にDoDで働いていたためです):
Gaius

@Gaius Ah、はい、選択できる選択肢が非常に多いため、標準が非常に優れているという古い議論があります。SQLが「標準」であり、PL / SQLが独自仕様であるため、+ 1 @jcolebrandであることを示すのは良いことだと思います。
-ScottCher

@ScottCher〜ありがとうございます。承認の印を押して番号を付ける標準機関がないので、それが標準だと言って愚かだと感じます。しかし、明確に定義され、同意されています。;)
jcolebrand
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.