web-dev-qa-db-ja.com

SQLとPL / SQLを区別するにはどうすればよいですか?

質問がばかげて聞こえるかもしれませんが、この部分は理解できませんでした。

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つのテーブル作成ステートメントの違いは何ですか?

https://stackoverflow.com/questions/2267386/Oracle-11g-varray-of-objects/2267813#226781

16
Lazer

確かに興味深い質問です。 Oracleの開発に精通しているほとんどの人はそれを考慮に入れませんが、それに行くと、SQLとPL/SQLの境界を定義するのが混乱することがあります。

頭字語の定義を確認することで、それぞれがカバーする機能の領域のアイデアを得ることができます。

SQL-構造化クエリ言語

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

注意深い読者は、SQLが2回表示されることに気付くかもしれません8)SQLはPL/SQLに埋め込まれていることが多いためです-PL/SQLは独自仕様を提供するために作られた言語です 第4世代言語(4GL) Oracleのデータベースオブジェクトで非常にうまく機能します。

ウィキペディアには [〜#〜] sql [〜#〜]PL/SQL の両方についてかなり良い資料があります

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

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

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

12
ScottCher

包まれたら

  • BEGIN ... END
  • DECLARE ... END
  • CREATE OR REPLACE ... END
  • プレフィックスEXECUTEのワンライナーです

次に、それはPL/SQLです。これは内部で何を意味しますか? SQLはクエリプランに "コンパイル"されて実行され、SELECTまたは他の場合に影響を受ける行数、またはエラーが発生した場合、結果セットを即座に返します。ただし、PL/SQLの方が複雑です。その中で参照されているすべてのオブジェクトが存在し、必要な権限が付与されているかどうかがチェックされ、PL/SQLが near-nativeコード にコンパイルされ、フルスピードで実行されます。依存関係が追跡され、表が変更された場合、それを参照するPL/SQLは再コンパイルが必要になります。この理由は速度です。すべてはコンパイル時に事前に実行されるため、PL/SQLでランタイムチェックを行う必要はありませんが、SQLステートメントは毎回チェックする必要があります(クエリプランがキャッシュされる場合でも、いわゆる soft parse 、特権はまだチェックする必要があり、ソフト解析でさえそれに関連するコストがあります)。

これは、Oracleが行うストアドプロシージャの「キラーアドバンテージ」の1つです。 PL/SQLストアドプロシージャまたはトリガーを実際に実行すると、結果を得るのに必要な最小限の計算が行われます。信頼できないOracleカーネルの外部で実行されているアプリケーションコードは、データを取得するために、さらに多くのフープを通過する必要があります。これは、OCamlやHaskellなどの厳密に型指定された透過的な高水準言語の場合と同じ議論です-コンパイル時に1回多くの作業を行い、コードが実行される何百万回もの時間で利益を得ることができます。

12
Gaius

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

SQLは標準です*。

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

* SQLは、明示的な文法とその文法の実装方法に関するルールを持つ言語です、is しかしではない標準 当たり前。 しかしながら、 誰もが同意できる言語仕様があるため、プログラムがSQLでのみ記述されている場合、SQLで記述されたものはすべて移植可能です。

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

5
jcolebrand