FrontPage > DataBase > PostgreSQL > PL/pgSQL
PostgreSQLのデータベース内にて動作するプログラム
トリガー登録する事で「INSERT、UPDATE、DELETE」時に動作させることが可能。
CREATE OR REPLACE FUNCTION [関数名]() RETURNS [戻り値] AS $[関数名]$ DECLARE -- 変数宣言 -- [変数名] [型]; -- [変数名] [テーブル名].[項目名]%TYPE; -- [(構造体)変数名] [テーブル名]%ROWTYPE; BEGIN -- 各種処理 -- 戻り値 RETURN [戻り値]; END; $[関数名]$ LANGUAGE 'plpgsql';
※「$[関数名]$ 〜 $[関数名]$」は、「' 〜 '」の代わり(※1)「$$ 〜 $$」でもOK
※1:その場合BEGIN内の「'[文字列]'」(文字表記)は、「' -> ''」と記載が必要。
-- [コメント] | "--" 以降をコメント化 |
/* [コメント] */ | 指定範囲をコメント化 |
PL/SQL内で使用する変数の宣言
変数名 [ CONSTANT ] 型 [ NOT NULL ] [ DEFAULT | := 既定値 ];
[変数名] [型] | 指定した型で変数を作成 |
[変数名] [テーブル名]%ROWTYPE; | テーブルと同じ構造体変数を作成 |
[変数名] [ビュー名]%ROWTYPE; | ビューと同じ構造体変数を作成 |
[変数名] RECORD; | SELECTと同じ構造を作成(FORループ内のみ) |
[変数名] [テーブル名].[項目名]%TYPE; | テーブルの項目と同じ型を作成 |
[変数名] [ビュー名].[項目名]%TYPE; | ビューの項目と同じ型を作成 |
[変数名] [変数名]%TYPE; | 事前に宣言した「変数」と同じ型を作成 |
SELECT INTO [レコードデータ型 変数] * FROM [テーブル名] WHERE [条件];個別で使用する事も可能。
[レコードデータ型 変数].[項目名] := [変数];
PL/SQLプログラム本体
IF [条件] THEN [一致時の処理] END IF | 条件分岐 |
IF [条件] THEN [一致時の処理] ELSE [不一致時の処理] END IF | 条件分岐 |
CASE [変数] WHEN [条件] THEN [処理] ... ELSE [処理] END CASE; | 多重判定 |
LOOP [処理] END LOOP; | ループ処理(永久ループ) |
WHILE [条件] LOOP [処理] LOOP; | ループ処理(条件が「TRUE」時のみループ) |
FOR [変数] IN [データ(SELECTなど)] LOOP [処理] LOOP; | ループ処理(データの個数回分ループ) |
EXIT; | ループ終了 |
EXIT [ラベル]; | 指定ラベルのループ終了 |
EXIT [ラベル] WHEN [条件]; | 条件ループ終了 |
NEW | レコードデータ型 | 変更後行データ(INSERT、UPDATE) |
OLD | レコードデータ型 | 変更前行データ(UPDATE、DELETE) |
TG_NAME | NAME型 | トリガの名前 |
TG_WHEN | TEXT型 | 'BEFORE':変更前トリガー、'AFTER':変更後トリガー |
TG_LEVEL | TEXT型 | 'ROW':、'STATEMENT': |
TG_OP | TEXT型 | 'INSERT':挿入トリガー、'UPDATE':更新トリガー、'DELETE':削除トリガー |
TG_RELID | OID型 | トリガー呼出対象のテーブルのオブジェクトID |
TG_RELNAME | NAME型 | トリガー呼出対象のテーブル名 |
TG_NARGS | 整数型 | トリガプロシージャの引数の数 |
TG_ARGV[] | TEXT配列型 | トリガプロシージャの引数 |
raise notice '変数名=%', [変数]~
NOTICE: 変数名= [変数]~