Sebenarnya, Postgres tidak memiliki prosedur tersimpan sebagaimana didefinisikan dalam standar ISO/IEC sebelum versi 11. Istilah ini sering digunakan secara tidak benar untuk merujuk ke fungsi , yang menyediakan banyak fungsi yang sama (dan lebih banyak lagi) seperti yang disediakan oleh RDBMS lain dengan "prosedur tersimpan". Perbedaan utama adalah penanganan transaksi.
- Apa perbedaan antara "Prosedur Tersimpan" dan "Fungsi Tersimpan"?
prosedur tersimpan True yang benar akhirnya diperkenalkan dengan Postgres 11
- Kapan menggunakan prosedur tersimpan/fungsi yang ditentukan pengguna?
Fungsi adalah atom di Postgres dan secara otomatis berjalan di dalam transaksi mereka sendiri kecuali dipanggil dalam transaksi luar. Mereka selalu berjalan dalam satu transaksi dan berhasil atau gagal sepenuhnya . Akibatnya, seseorang tidak dapat memulai atau melakukan transaksi dalam fungsi tersebut. Dan perintah seperti VACUUM
, CREATE DATABASE
, atau CREATE INDEX CONCURRENTLY
yang tidak berjalan dalam konteks transaksi tidak diperbolehkan.
Panduan tentang PL/pgSQL:
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.
Penanganan kesalahan:
Secara default, setiap kesalahan yang terjadi dalam fungsi PL/pgSQL membatalkan eksekusi fungsi, dan juga transaksi di sekitarnya. Anda dapat menjebak kesalahan dan memulihkannya dengan menggunakan
BEGIN
blokir denganEXCEPTION
klausa.
Ada pengecualian , termasuk namun tidak terbatas pada:
- data yang ditulis ke file log
-
perubahan yang dibuat pada urutan
Penting :Beberapa tipe dan fungsi data PostgreSQL memiliki aturan khusus mengenai perilaku transaksional. Secara khusus, perubahan yang dilakukan pada urutan (dan oleh karena itu penghitung kolom dideklarasikan menggunakan
serial
)segera terlihat oleh semua transaksi lain dan tidak dibatalkan jika transaksi yang membuat perubahan dibatalkan. -
pernyataan yang disiapkan
- Demo SQL Fiddle
-
panggilan dblink (atau yang serupa)
- Apakah Postgres mendukung transaksi bersarang atau otonom?