他のプログラミング言語ベースに対して、 SQLとの親和性が高いです。 ほぼほぼSQLがそのまま書けて、代入、判定、ループと融合しています。 • 代入 w_value := p_value + 1; • 判定 IF p_uuid IS NOT NULL THEN END IF; • ループ FOR w_index IN 1..10 LOOP END LOOP; ▪ こんなループも書けます FOR w_row IN SELECT t1.uuid ,t1.name FROM users AS t1 LOOP IF w_row.name LIKE ‘%abc%’ THEN END IF END LOOP;
目的ごとに2種類のユーザー定義処理を作成できます。 • FUNCTION 主に値を返すことが目的です。特に複数行返すことでテーブルと同じ使い勝手になります • PROCEDURE 主にトランザクション制御が目的です。任意のタイミングでコミットすることができます。 SELECT t1.* FROM my_function() AS t1; IF w_name = ‘abc’ THEN COMMIT; END IF;
また任意の型が定義できます。例えば 2つのテーブルを結合したような型を定義して FUNCTIONの戻り値に設 定できます。 DROP TYPE IF EXISTS type_project_get_select_users CASCADE; CREATE TYPE type_project_get_select_users AS ( uuid UUID, name TEXT company_name TEXT ); CREATE OR REPLACE FUNCTION project_get_select_users( ) RETURNS SETOF type_project_get_select_users AS $FUNCTION$ DECLARE BEGIN RETURN QUERY SELECT t1.uuid, t1.name, t2.name FROM users AS t1 INNER JOIN companies AS t2 ON (t1.company_uuid = t2.uuid); END; $FUNCTION$ LANGUAGE plpgsql;
SELECT IF SELECT IF SELECT ELSE SELECT 他のFUNCTIONをコール IF INSERT ELSE UPDATE IF SELECT UPDATE INSERT SELECT IF 計算 RETURN IF RETURN FOR(SELECT) IF UPDATE ELSE UPDATE 実際の例 記事と一緒にメディアを登録する PL/pgSQL
Build high-performance functions in Rust on Amazon RDS for PostgreSQL という資料でPL/Rust、PL/pgSQL、PL/v8のパフォーマンスを測定しています。 特定の条件下ではPL/Rustが4倍も早いようなので、今後利用していくことになると思います。