| PostgreSQL | PostgreSQLのストアドプロシージャ | |
| 2025/03/02 |
| PL/pgSQLによるストアドファンクションとストアドプロシージャ |
| ストアドファンクション |
CREATE OR REPLACE FUNCTION count_higher(ani_price int)
RETURNS int AS $$
DECLARE
ln_count int := 0;
BEGIN
SELECT COUNT(*) INTO ln_count
FROM ITEMS
WHERE UNIT_PRICE > ani_price;
RETURN ln_count;
END;
$$ LANGUAGE plpgsql;
では、次にpsqlコマンドでこのファンクションを実行してみます。
mydb=> select count_higher(10000);
count_higher
------------
3
| ストアドプロシージャ |
CREATE OR REPLACE PROCEDURE MINMAX(
IN avi_in1 varchar, IN avi_in2 varchar, OUT avo_min varchar, OUT avo_max varchar
) LANGUAGE plpgsql AS $$
BEGIN
IF avi_in1 > avi_in2 THEN
avo_min = avi_in2;
avo_max = avi_in1;
ELSE
avo_min = avi_in1;
avo_max = avi_in2;
END IF;
END;
$$;
psqlで実行するときは次のようにCALL文を使います。
CALL MINMAX('March', 'April', NULL, NULL);
CALL MINMAX('March', 'April');
ERROR: procedure minmax(unknown, unknown) does not exist
LINE 1: CALL MINMAX('March', 'April'); ^
HINT: No procedure matches the given name and argument types. You might need to add explicit type casts.
| 独自の配列型を引数に持つストアドプロシージャ |
CREATE DOMAIN MYARRAY AS VARCHAR[];
CREATE OR REPLACE PROCEDURE MINMAXM(
IN ati_values MYARRAY, OUT avo_min varchar, OUT avo_max varchar
) LANGUAGE plpgsql AS $$
DECLARE
s VARCHAR(100);
lv_min_value VARCHAR(100) := 'ZZZZZZ';
lv_max_value VARCHAR(100) := '';
BEGIN
foreach s in ARRAY ati_values::VARCHAR[] loop
IF s < lv_min_value THEN
lv_min_value := s;
END IF;
IF s > lv_max_value THEN
lv_max_value := s;
END IF;
end loop;
avo_min := lv_min_value;
avo_max := lv_max_value;
END;
$$;
| もくじ | ||
| PostgreSQL | (C) 2002-2025 MISUMI URANO (2002/01/12 - 2025/03/02) |