Commit in Funktionen

Hallo,
ich bin nicht sicher, aber ich vermute ein Konfigurations-Problem, und ich finde einfach nicht heraus, wo es liegt.

Laut Doku sollte es seit Postgres 11 möglich sein, in einer Funktion/Prozedure ein “commit” auszuführen. Leider geht das bei mir nicht. Ich habe zum testen mal eine Prozedur angelegt:

CREATE OR REPLACE PROCEDURE public.committest()
    LANGUAGE plpgsql
AS $procedure$
declare
  test bigint;
    BEGIN
        select id into test from "AUTH".info;
        commit;
    END;
$procedure$
;

Wenn ich dann mit

call public.committest();

den Aufruf mache (egal ob in psql oder dbeaver, ohne darin eine transaktion zu starten), bekomme ich eine Fehlermeldung:

SQL-Fehler [2D000]: ERROR: invalid transaction termination
  Wobei: PL/pgSQL function committest() line 6 at COMMIT

Wie löse ich das?

Hmm, ich habe es getestet und kann dein Problem nicht nachvollziehen.

frastr=# select version();
                                        version                                         
----------------------------------------------------------------------------------------
 PostgreSQL 11.19 on x86_64-pc-linux-gnu, compiled by gcc (GCC) 12.2.1 20230201, 64-bit
(1 Zeile)

frastr=# create table test
frastr-# (
frastr(#     id integer
frastr(# );
CREATE TABLE
frastr=# insert into test
frastr-# select id from generate_series(1, 42) as t(id);
INSERT 0 42
frastr=# create or replace procedure committest() as
frastr-# $$
frastr$# declare
frastr$#     v_cnt   integer;
frastr$# begin
frastr$#     select count(*) into v_cnt from test;
frastr$#     commit;
frastr$#     raise notice 'Anzahl Zeilen = %', v_cnt;
frastr$# end;
frastr$# $$
frastr-# language plpgsql;
CREATE PROCEDURE
frastr=# call committest();
HINWEIS:  Anzahl Zeilen = 42
CALL
frastr=# 

Lokal funktioniert es bei mir auch, aber auf dem ubuntu-server nicht. Deswegen vermute ich einen konfigurationsproblem. Ich habe aber keine idee, was man wo konfigurieren könnte.

frastr=# \echo :AUTOCOMMIT
on
frastr=# call committest();
CALL
frastr=# \set AUTOCOMMIT off
frastr=# call committest();
ERROR:  invalid transaction termination
CONTEXT:  PL/pgSQL function committest() line 6 at COMMIT
frastr=# 

Ok, herzlichen Dank. Habe es noch nicht probiert, aber es bestätigt ja meine Vermutung. Nur das ich es genau umgekehrt erwartet hätte…