PostgreSQL
 sql >> Teknologi Basis Data >  >> RDS >> PostgreSQL

PostgreSQL tidak dapat memulai/mengakhiri transaksi di PL/pgSQL

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?


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Analog postgres untuk CROSS APPLY di SQL Server

  2. Bagaimana cara meminta nilai nol dalam jenis bidang json postgresql?

  3. Optimalisasi kueri Postgres (memaksa pemindaian indeks)

  4. Gabungkan beberapa pernyataan SELECT

  5. Postgres:perintah vakum tidak membersihkan tupel yang mati