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…

Dieses Thema wurde automatisch 60 Tage nach der letzten Antwort geschlossen. Es sind keine neuen Antworten mehr erlaubt.