postgresql
PL / pgSQLによるプログラミング
サーチ…
備考
PL / pgSQLは、他のデータベースのストアドプロシージャと呼ばれるデータベース内で実行される関数を書くためのPostgreSQLの組み込みプログラミング言語です。これは、ループ、条件文、および戻り値の型でSQLを拡張します。多くの開発者にとって構文が奇妙なことはありますが、データベースへの接続のオーバーヘッドがなくなるため、アプリケーションサーバー上で実行されているものよりもはるかに高速です。クエリを実行して結果を待つ必要がある場合、別のクエリを送信します。
PL / Python、PL / Perl、PLV8など、PostgreSQLには他の多くの手続き型言語が存在しますが、その構文がSQL上に構築されているため、最初のPostgreSQL関数を作成する開発者にとって共通の出発点です。また、PL / SQLに精通している開発者であれば、その言語に精通していることがわかります。将来、Oracleアプリケーションを開発しようとしているが、フリー・データベースから開始したい開発者は、 PL / pgSQLからPL / SQLへの移行が比較的簡単です。
他の手続き型言語が存在し、PL / pgSQLがスピードを含めていかなる点でも優れているわけではないことを強調する必要がありますが、PL / pgSQLの例はPostgreSQL関数を書くために使用される他の言語の共通参照点として役立ちます。 PL / pgSQLには、すべてのPLのチュートリアルと書籍があります。
PL / pgSQLに関するいくつかの無料ガイドと書籍へのリンクがあります:
- 公式ドキュメント: https : //www.postgresql.org/docs/current/static/plpgsql.html
- w3resource.comチュートリアル: http : //www.w3resource.com/PostgreSQL/pl-pgsql-tutorial.php
- postgres.czチュートリアル: http : //postgres.cz/wiki/PL/pgSQL_(en)
- PostgreSQLサーバプログラミング、第2版: https : //www.packtpub.com/big-data-and-business-intelligence/postgresql-server-programming-secondededition
- PostgreSQL開発者ガイド: https : //www.packtpub.com/big-data-and-business-intelligence/postgresql-developers-guide
基本的なPL / pgSQL関数
単純なPL / pgSQL関数:
CREATE FUNCTION active_subscribers() RETURNS bigint AS $$
DECLARE
-- variable for the following BEGIN ... END block
subscribers integer;
BEGIN
-- SELECT must always be used with INTO
SELECT COUNT(user_id) INTO subscribers FROM users WHERE subscribed;
-- function result
RETURN subscribers;
EXCEPTION
-- return NULL if table "users" does not exist
WHEN undefined_table
THEN RETURN NULL;
END;
$$ LANGUAGE plpgsql;
これは、SQL文だけで実現できたものの、関数の基本構造を示しています。
この関数を実行するには:
select active_subscribers();
PL / pgSQL構文
CREATE [OR REPLACE] FUNCTION functionName (someParameter 'parameterType')
RETURNS 'DATATYPE'
AS $_block_name_$
DECLARE
--declare something
BEGIN
--do something
--return something
END;
$_block_name_$
LANGUAGE plpgsql;
ブロックを返す
PL / pgSQL関数で返すためのオプション:
-
Datatype
すべてのデータDatatype
リスト -
Table(column_name column_type, ...)
-
Setof 'Datatype' or 'table_column'
カスタム例外
カスタム例外「P2222」を作成します。
create or replace function s164() returns void as
$$
begin
raise exception using message = 'S 164', detail = 'D 164', hint = 'H 164', errcode = 'P2222';
end;
$$ language plpgsql
;
errmを割り当てないカスタム例外を作成する:
create or replace function s165() returns void as
$$
begin
raise exception '%','nothing specified';
end;
$$ language plpgsql
;
呼び出し:
t=# do
$$
declare
_t text;
begin
perform s165();
exception when SQLSTATE 'P0001' then raise info '%','state P0001 caught: '||SQLERRM;
perform s164();
end;
$$
;
INFO: state P0001 caught: nothing specified
ERROR: S 164
DETAIL: D 164
HINT: H 164
CONTEXT: SQL statement "SELECT s164()"
PL/pgSQL function inline_code_block line 7 at PERFORM
ここでカスタムP0001が処理され、P2222が実行されず、実行が中断されます。
また、ここでのような例外のテーブルを保持することは非常に意味があります: http : //stackoverflow.com/a/2700312/5315974