用語を明確にするには:
SQLはクエリです リレーショナルデータベースのデータを選択、更新、削除、または作成するために使用される言語。 手続き型要素
はありません。 ループのように( FOR
、 WHILE
)または条件文( IF
、 ELSE
)または変数またはカーソル。
CREATE FUNCTION
は確かに「SQLステートメント」ですが、SQLクエリ「エンジン」とは異なるものによって実行されるコードのブロックを指定するための単なる「ラッパー」です。 Postgresは(他のDBMSとは異なり)、「CREATEFUNCTION」ステートメントに渡されたコードのブロックを実行できる複数の「ランタイムエンジン」をサポートします。その1つのアーティファクトは、コードが実際には文字列であるため、 CREATE FUNCTION コード> 文字列のみが表示され、他には何も表示されません。
SQLには手続き型要素がないため、手続き型コードとSQLコードを混在させることはできません。手続き型コードを実行する場合は、何らかの方法で「エンジン」を切り替えていることをサーバーに通知する必要があります。これは、(SQL) DO
を介して行われます。 何をすべきかわからない文字列を再び受け取り、それをサーバーに送信して、「エンジン'xyz'が実行できるとユーザーが主張したコードの一部です」と言うコマンド-xyz
PL / pgSQL、Python、Perl、またはまったく異なるもののいずれかです。
これは、 DECLARE
で始まるOracleの匿名PL/SQLブロックと同じです。 -それ以降はすべて、サーバー上の別のランタイムエンジンによって実行されます。 MySQLにはそのような機能はありません。手続き型コードを実行する唯一の方法は、プロシージャ(または関数)を作成して実行することです。そのため、 DO
のようなものはありません。 MySQLで。
手続き型コードと「プレーンSQL」を明確に区別しない唯一のDBMS製品はSQLServerです。T-SQLはSQL言語の拡張機能であり、バックエンドにコードを通知せずに「通常のSQL」と手続き型SQLを混在させることができます。実行するには別のエンジンが必要です(これは、SQL ServerからPostgresまたはOracleに移行する人々にとって大きな混乱の原因です)。
SQL / PSMは、クエリ言語としてSQLを使用するデータベースエンジンに埋め込むことができる手続き型要素を定義する標準です。 SQL/PSMを実際に実装するDBMS製品はありません。 PostgresのPL/pgSQL、OracleのPL / SQL、MySQLの手続き型方言はそれと多少似ていますが、SQL/PSM標準に準拠しているとは言えません。 SQL / PSM標準に最も近いのはDB2であり、おそらく HSQLDB
それは本当です。しかし、その後、いいえ DBMSはSQL標準を完全に実装していますが、Postgresの実装はおそらく標準に最も近いものです。