fungsi plpgsql otomatis berjalan di dalam transaksi. Semuanya berhasil atau semuanya gagal. Panduan:
Fungsi dan prosedur pemicu selalu dieksekusi dalam transaksi yang dibuat oleh kueri luar — mereka tidak dapat memulai atau melakukan transaksi itu, karena tidak akan ada konteks bagi mereka untuk mengeksekusi. Namun, blok yang berisi
EXCEPTION
klausa secara efektif membentuk subtransaksi yang dapat dibatalkan tanpa mempengaruhi transaksi luar. Untuk lebih lanjut tentang itu lihat Bagian 42.6.6.
Jadi, jika perlu, Anda dapat menangkap pengecualian yang secara teoritis mungkin terjadi (tetapi sangat kecil kemungkinannya).
Detail tentang kesalahan trapping di manual.
Fungsi Anda ditinjau dan disederhanakan:
CREATE FUNCTION foo(v_weather text
, v_timeofday text
, v_speed text
, v_behavior text)
RETURNS SETOF custombehavior
LANGUAGE plpgsql AS
$func$
BEGIN
DELETE FROM custombehavior
WHERE weather = 'RAIN'
AND timeofday = 'NIGHT'
AND speed = '45MPH';
INSERT INTO custombehavior (weather, timeofday, speed, behavior)
SELECT v_weather, v_timeofday, v_speed, v_behavior
WHERE NOT EXISTS (
SELECT FROM defaultbehavior
WHERE a = 'RAIN'
AND b = 'NIGHT'
AND c = '45MPH'
);
RETURN QUERY
SELECT * FROM custombehavior WHERE ... ;
END
$func$;
Jika Anda benar-benar perlu memulai/mengakhiri transaksi seperti yang ditunjukkan dalam judul lihat ke prosedur SQL di Postgres 11 atau lebih baru (CREATE PROCEDURE
). Lihat:
- Di PostgreSQL, apa perbedaan antara "Prosedur Tersimpan" dan jenis fungsi lainnya?