do $$
begin -- basic case for i in1..3loop
raise notice '1..3: i = %', i;
end loop; -- with BY, end matches exactly for i in1..10by3loop
raise notice '1..10 by 3: i = %', i;
end loop; -- with BY, end does not match for i in1..11by3loop
raise notice '1..11 by 3: i = %', i;
end loop; -- zero iterations for i in1..0by3loop
raise notice '1..0 by 3: i = %', i;
end loop; -- REVERSE for i in reverse 10..0by3loop
raise notice 'reverse 10..0 by 3: i = %', i;
end loop; -- potential overflow for i in2147483620..2147483647by10loop
raise notice '2147483620..2147483647 by 10: i = %', i;
end loop; -- potential overflow, reverse direction for i in reverse -2147483620..-2147483647by10loop
raise notice 'reverse -2147483620..-2147483647 by 10: i = %', i;
end loop;
end$$;
-- BY can't be zero or negative
do $$
begin for i in1..3by0loop
raise notice '1..3 by 0: i = %', i;
end loop;
end$$;
do $$
begin for i in1..3by -1loop
raise notice '1..3 by -1: i = %', i;
end loop;
end$$;
do $$
begin for i in reverse 1..3by -1loop
raise notice 'reverse 1..3 by -1: i = %', i;
end loop;
end$$;
create function continue_test1() returns void as $$ declare _i integer = 0; _r record;
begin
raise notice '---1---'; loop
_i := _i + 1;
raise notice '%', _i; continuewhen _i < 10; exit;
end loop;
raise notice '---2---';
<<lbl>> loop
_i := _i - 1; loop
raise notice '%', _i; continue lbl when _i > 0; exit lbl;
end loop;
end loop;
raise notice '---3---';
<<the_loop>> while _i < 10loop
_i := _i + 1; continue the_loop when _i % 2 = 0;
raise notice '%', _i;
end loop;
raise notice '---4---'; for _i in1..10loop
begin -- applies to outer loop, not the nested begin block continuewhen _i < 5;
raise notice '%', _i;
end;
end loop;
raise notice '---5---'; for _r inselect * from conttesttbl loop continuewhen _r.v <= 20;
raise notice '%', _r.v;
end loop;
raise notice '---6---'; for _r in execute 'select * from conttesttbl'loop continuewhen _r.v <= 20;
raise notice '%', _r.v;
end loop;
raise notice '---7---';
<<looplabel>> for _i in1..3loop continue looplabel when _i = 2;
raise notice '%', _i;
end loop;
raise notice '---9---'; for _r inselect * from conttesttbl orderby v limit1loop
raise notice '%', _r.v; continue;
end loop;
raise notice '---10---'; for _r in execute 'select * from conttesttbl order by v limit 1'loop
raise notice '%', _r.v; continue;
end loop;
raise notice '---11---';
<<outerlooplabel>> for _i in1..2loop
raise notice 'outer %', _i;
<<innerlooplabel>> for _j in1..3loop continue outerlooplabel when _j = 2;
raise notice 'inner %', _j;
end loop;
end loop;
end; $$ language plpgsql;
select continue_test1();
-- should fail: CONTINUE is only legal inside a loop create function continue_error1() returns void as $$
begin
begin continue;
end;
end;
$$ language plpgsql;
-- should fail: unlabeled EXIT is only legal inside a loop create function exit_error1() returns void as $$
begin
begin exit;
end;
end;
$$ language plpgsql;
-- should fail: no such label create function continue_error2() returns void as $$
begin
begin loop continue no_such_label;
end loop;
end;
end;
$$ language plpgsql;
-- should fail: no such label create function exit_error2() returns void as $$
begin
begin loop exit no_such_label;
end loop;
end;
end;
$$ language plpgsql;
-- should fail: CONTINUE can't reference the label of a named block create function continue_error3() returns void as $$
begin
<<begin_block1>>
begin loop continue begin_block1;
end loop;
end;
end;
$$ language plpgsql;
-- On the other hand, EXIT *can* reference the label of a named block create function exit_block1() returns void as $$
begin
<<begin_block1>>
begin loop exit begin_block1;
raise exception 'should not get here';
end loop;
end;
end;
$$ language plpgsql;
select exit_block1();
-- verbose end block and end loop create function end_label1() returns void as $$
<<blbl>>
begin
<<flbl1>> for i in1 .. 10loop
raise notice 'i = %', i; exit flbl1;
end loop flbl1;
<<flbl2>> for j in1 .. 10loop
raise notice 'j = %', j; exit flbl2;
end loop;
end blbl;
$$ language plpgsql;
select end_label1();
-- should fail: undefined end label create function end_label2() returns void as $$
begin for _i in1 .. 10loop exit;
end loop flbl1;
end;
$$ language plpgsql;
-- should fail: end label does not match start label create function end_label3() returns void as $$
<<outer_label>>
begin
<<inner_label>> for _i in1 .. 10loop exit;
end loop outer_label;
end;
$$ language plpgsql;
-- should fail: end label on a block without a start label create function end_label4() returns void as $$
<<outer_label>>
begin for _i in1 .. 10loop exit;
end loop outer_label;
end;
$$ language plpgsql;
-- unlabeled exit matches no blocks
do $$
begin for i in1..10loop
<<innerblock>>
begin
begin -- unlabeled block exit;
raise notice 'should not get here';
end;
raise notice 'should not get here, either';
end;
raise notice 'nor here';
end loop;
raise notice 'should get here';
end$$;
-- check exit out of an unlabeled block to a labeled one
do $$
<<outerblock>>
begin
<<innerblock>>
begin
<<moreinnerblock>>
begin
begin -- unlabeled block exit innerblock;
raise notice 'should not get here';
end;
raise notice 'should not get here, either';
end;
raise notice 'nor here';
end;
raise notice 'should get here';
end$$;
-- check exit out of outermost block
do $$
<<outerblock>>
begin
<<innerblock>>
begin exit outerblock;
raise notice 'should not get here';
end;
raise notice 'should not get here, either';
end$$;
-- unlabeled exit does match a while loop
do $$
begin
<<outermostwhile>> while1 > 0loop
<<outerwhile>> while1 > 0loop
<<innerwhile>> while1 > 0loop exit;
raise notice 'should not get here';
end loop;
raise notice 'should get here'; exit outermostwhile;
raise notice 'should not get here, either';
end loop;
raise notice 'nor here';
end loop;
raise notice 'should get here, too';
end$$;
-- check exit out of an unlabeled while to a labeled one
do $$
begin
<<outerwhile>> while1 > 0loop while1 > 0loop exit outerwhile;
raise notice 'should not get here';
end loop;
raise notice 'should not get here, either';
end loop;
raise notice 'should get here';
end$$;
-- continue to an outer while
do $$ declare i int := 0;
begin
<<outermostwhile>> while i < 2loop
raise notice 'outermostwhile, i = %', i;
i := i + 1;
<<outerwhile>> while1 > 0loop
<<innerwhile>> while1 > 0loop continue outermostwhile;
raise notice 'should not get here';
end loop;
raise notice 'should not get here, either';
end loop;
raise notice 'nor here';
end loop;
raise notice 'out of outermostwhile, i = %', i;
end$$;
-- return out of a while create function return_from_while() returns int language plpgsql as $$ declare i int := 0;
begin while i < 10loop if i > 2then return i;
end if;
i := i + 1;
end loop; returnnull;
end$$;
select return_from_while();
-- using list of scalars in fori and fore stmts create function for_vect() returns void as $proc$
<<lbl>>declare a integer; b varchar; c varchar; r record;
begin -- fori for i in1 .. 3loop
raise notice '%', i;
end loop; -- fore with record var for r inselect gs as aa, 'BB'as bb, 'CC'as cc from generate_series(1,4) gs loop
raise notice '% % %', r.aa, r.bb, r.cc;
end loop; -- fore with single scalar for a inselect gs from generate_series(1,4) gs loop
raise notice '%', a;
end loop; -- fore with multiple scalars for a,b,c inselect gs, 'BB','CC'from generate_series(1,4) gs loop
raise notice '% % %', a, b, c;
end loop; -- using qualified names in fors, fore is enabled, disabled only for fori for lbl.a, lbl.b, lbl.c in execute $$select gs, 'bb','cc'from generate_series(1,4) gs$$ loop
raise notice '% % %', a, b, c;
end loop;
end;
$proc$ language plpgsql;
select for_vect();
-- CASE statement
createorreplace function case_test(bigint) returns text as $$ declare a int = 10;
b int = 1;
begin case $1 when1then return'one'; when2then return'two'; when3,4,3+5then return'three, four or eight'; when a then return'ten'; when a+b, a+b+1then return'eleven, twelve';
end case;
end;
$$ language plpgsql immutable;
createorreplace function catch() returns void as $$
begin
raise notice '%', case_test(6);
exception when case_not_found then
raise notice 'caught case_not_found % %', SQLSTATE, SQLERRM;
end
$$ language plpgsql;
select catch();
-- test the searched variant too, as well as ELSE createorreplace function case_test(bigint) returns text as $$ declare a int = 10;
begin case when $1 = 1then return'one'; when $1 = a + 2then return'twelve'; else return'other';
end case;
end;
$$ language plpgsql immutable;
-- test line comment between WHEN and THEN createorreplace function case_comment(int) returns text as $$
begin case $1 when1-- comment before THEN thenreturn'one'; else return'other';
end case;
end;
$$ language plpgsql immutable;
select case_comment(1);
Messung V0.5 in Prozent
¤ Dauer der Verarbeitung: 0.25 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.