CREATEPROCEDURE test_proc1()
LANGUAGE plpgsql AS $$
BEGIN NULL;
END;
$$;
CALL test_proc1();
-- error: can't return non-NULL CREATEPROCEDURE test_proc2()
LANGUAGE plpgsql AS $$
BEGIN RETURN5;
END;
$$;
CREATETABLE test1 (a int);
CREATEPROCEDURE test_proc3(x int)
LANGUAGE plpgsql AS $$
BEGIN INSERTINTO test1 VALUES (x);
END;
$$;
CALL test_proc3(55);
SELECT * FROM test1;
-- Check that plan revalidation doesn't prevent setting transaction properties -- (bug #18059). This test must include the first temp-object creation in -- this script, or it won't exercise the bug scenario. Hence we put it early. CREATEPROCEDURE test_proc3a()
LANGUAGE plpgsql AS $$
BEGIN COMMIT; SET TRANSACTION ISOLATION LEVEL REPEATABLE READ;
RAISE NOTICE 'done';
END;
$$;
CREATEPROCEDURE test_proc4(y int)
LANGUAGE plpgsql AS $$
BEGIN CALL test_proc3(y); CALL test_proc3($1);
END;
$$;
CALL test_proc4(66);
SELECT * FROM test1;
CALL test_proc4(66);
SELECT * FROM test1;
-- output arguments
CREATEPROCEDURE test_proc5(INOUT a text)
LANGUAGE plpgsql AS $$
BEGIN
a := a || '+' || a;
END;
$$;
CALL test_proc5('abc');
CREATEPROCEDURE test_proc6(a int, INOUT b int, INOUT c int)
LANGUAGE plpgsql AS $$
BEGIN
b := b * a;
c := c * a;
END;
$$;
CALL test_proc6(2, 3, 4);
DO
LANGUAGE plpgsql
$$ DECLARE
x int := 3;
y int := 4;
BEGIN CALL test_proc6(2, x, y);
RAISE INFO 'x = %, y = %', x, y; CALL test_proc6(2, c => y, b => x);
RAISE INFO 'x = %, y = %', x, y;
END;
$$;
DO
LANGUAGE plpgsql
$$ DECLARE
x int := 3;
y int := 4;
BEGIN CALL test_proc6(2, x + 1, y); -- error
RAISE INFO 'x = %, y = %', x, y;
END;
$$;
DO
LANGUAGE plpgsql
$$ DECLARE
x constant int := 3;
y int := 4;
BEGIN CALL test_proc6(2, x, y); -- error because x is constant
END;
$$;
DO
LANGUAGE plpgsql
$$ DECLARE
x int := 3;
y int := 4;
BEGIN FOR i IN1..5LOOP CALL test_proc6(i, x, y);
RAISE INFO 'x = %, y = %', x, y;
END LOOP;
END;
$$;
-- recursive with output arguments
CREATEPROCEDURE test_proc7(x int, INOUT a int, INOUT b numeric)
LANGUAGE plpgsql AS $$
BEGIN IF x > 1THEN
a := x / 10;
b := x / 2; CALL test_proc7(b::int, a, b);
END IF;
END;
$$;
CALL test_proc7(100, -1, -1);
-- inner COMMIT with output arguments
CREATEPROCEDURE test_proc7c(x int, INOUT a int, INOUT b numeric)
LANGUAGE plpgsql AS $$
BEGIN
a := x / 10;
b := x / 2; COMMIT;
END;
$$;
CREATEPROCEDURE test_proc7cc(_x int)
LANGUAGE plpgsql AS $$ DECLARE _a int; _b numeric;
BEGIN CALL test_proc7c(_x, _a, _b);
RAISE NOTICE '_x: %,_a: %, _b: %', _x, _a, _b;
END
$$;
CALL test_proc7cc(10);
-- named parameters and defaults
CREATEPROCEDURE test_proc8a(INOUT a int, INOUT b int)
LANGUAGE plpgsql AS $$
BEGIN
RAISE NOTICE 'a: %, b: %', a, b;
a := a * 10;
b := b + 10;
END;
$$;
CALL test_proc8a(10, 20); CALL test_proc8a(b => 20, a => 10);
CREATEPROCEDURE test_proc8b(INOUT a int, INOUT b int, INOUT c int)
LANGUAGE plpgsql AS $$
BEGIN
RAISE NOTICE 'a: %, b: %, c: %', a, b, c;
a := a * 10;
b := b + 10;
c := c * -10;
END;
$$;
CREATEPROCEDURE test_proc8c(INOUT a int, INOUT b int, INOUT c intDEFAULT11)
LANGUAGE plpgsql AS $$
BEGIN
RAISE NOTICE 'a: %, b: %, c: %', a, b, c;
a := a * 10;
b := b + 10;
c := c * -10;
END;
$$;
DO $$ DECLARE _a int; _b int; _c int;
BEGIN
_a := 10; _b := 30; _c := 50; CALL test_proc8c(_a, _b); -- fail, no output argument for c
RAISE NOTICE '_a: %, _b: %, _c: %', _a, _b, _c;
END
$$;
DO $$ DECLARE _a int; _b int; _c int;
BEGIN
_a := 10; _b := 30; _c := 50; CALL test_proc8c(_a, b => _b); -- fail, no output argument for c
RAISE NOTICE '_a: %, _b: %, _c: %', _a, _b, _c;
END
$$;
-- OUT parameters
CREATEPROCEDURE test_proc9(IN a int, OUT b int)
LANGUAGE plpgsql AS $$
BEGIN
RAISE NOTICE 'a: %, b: %', a, b;
b := a * 2;
END;
$$;
DO $$ DECLARE _a int; _b int;
BEGIN
_a := 10; _b := 30; CALL test_proc9(_a, _b);
RAISE NOTICE '_a: %, _b: %', _a, _b;
END
$$;
CREATEPROCEDURE test_proc10(IN a int, OUT b int, IN c intDEFAULT11)
LANGUAGE plpgsql AS $$
BEGIN
RAISE NOTICE 'a: %, b: %, c: %', a, b, c;
b := a - c;
END;
$$;
CREATEPROCEDURE test_proc12(a anyelement, OUT b anyelement, OUT c anyarray)
LANGUAGE plpgsql AS $$
BEGIN
RAISE NOTICE 'a: %', a;
b := a;
c := array[a];
END;
$$;
DO $$ DECLARE _a int; _b int; _c int[];
BEGIN
_a := 10; CALL test_proc12(_a, _b, _c);
RAISE NOTICE '_a: %, _b: %, _c: %', _a, _b, _c;
END
$$;
CREATE FUNCTION f_get_x () RETURNS int AS $$ DECLARE l_result int;
BEGIN SELECT x INTO l_result FROM t_test; RETURN l_result;
END
$$ LANGUAGE plpgsql STABLE;
CREATEPROCEDURE f_print_x (x int) AS $$
BEGIN
RAISE NOTICE 'f_print_x(%)', x;
END
$$ LANGUAGE plpgsql;
-- test in non-atomic context
DO $$
BEGIN UPDATE t_test SET x = x + 1;
RAISE NOTICE 'f_get_x(%)', f_get_x(); CALL f_print_x(f_get_x()); UPDATE t_test SET x = x + 1;
RAISE NOTICE 'f_get_x(%)', f_get_x(); CALL f_print_x(f_get_x());
ROLLBACK;
END
$$;
-- test in non-atomic context, except exception block is locally atomic
DO $$
BEGIN
BEGIN UPDATE t_test SET x = x + 1;
RAISE NOTICE 'f_get_x(%)', f_get_x(); CALL f_print_x(f_get_x()); UPDATE t_test SET x = x + 1;
RAISE NOTICE 'f_get_x(%)', f_get_x(); CALL f_print_x(f_get_x());
EXCEPTION WHEN division_by_zero THEN
RAISE NOTICE '%', SQLERRM;
END;
ROLLBACK;
END
$$;
-- test in atomic context
BEGIN;
DO $$
BEGIN UPDATE t_test SET x = x + 1;
RAISE NOTICE 'f_get_x(%)', f_get_x(); CALL f_print_x(f_get_x()); UPDATE t_test SET x = x + 1;
RAISE NOTICE 'f_get_x(%)', f_get_x(); CALL f_print_x(f_get_x());
END
$$;
ROLLBACK;
Messung V0.5 in Prozent
¤ Dauer der Verarbeitung: 0.23 Sekunden
(vorverarbeitet am 2026-08-08)
¤
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.