Apa perbedaan antara "Prosedur Tersimpan" dan "Fungsi Tersimpan"?

36

Jadi komentar dari pertanyaan ini menyebutkan, bahwa ada sedikit perbedaan dalam "Stored Procedrues" dan "Stored Funtions" di PostgreSQL.

Komentar tersebut menghubungkan ke artikel wikipedia tetapi beberapa di antaranya tampaknya tidak berlaku (misalnya, mereka dapat digunakan dalam SELECTpernyataan).

The sintaks itu sendiri tampaknya menjadi sedikit membingungkan:

CREATE FUNCTION emp_stamp() RETURNS trigger AS $emp_stamp$
    BEGIN
       [...]
    END;
$emp_stamp$ LANGUAGE plpgsql;

CREATE TRIGGER emp_stamp BEFORE INSERT OR UPDATE ON emp
    FOR EACH ROW EXECUTE PROCEDURE emp_stamp();

Anda membuat FUNCTIONtetapi merujuknya sebagai PROCEDURE.

Jadi apa bedanya keduanya?

DrColossos
sumber

Jawaban:

43

Secara resmi, PostgreSQL hanya memiliki "fungsi". Fungsi pemicu kadang-kadang disebut sebagai "prosedur pemicu", tetapi penggunaan itu tidak memiliki arti yang berbeda. Secara internal, fungsi kadang-kadang disebut sebagai prosedur, seperti dalam katalog sistem pg_proc. Itu peninggalan dari PostQUEL. Setiap fitur yang beberapa orang (mungkin dengan pengalaman dalam sistem basis data yang berbeda) mungkin terkait dengan prosedur, seperti relevansinya untuk mencegah injeksi SQL atau penggunaan parameter output, juga berlaku untuk fungsi seperti yang ada di PostgreSQL.

Sekarang, ketika orang-orang di komunitas PostgreSQL berbicara tentang "prosedur tersimpan" atau "prosedur tersimpan nyata", bagaimanapun, mereka sering berarti fitur hipotetis dari objek seperti fungsi yang dapat memulai dan menghentikan transaksi dalam tubuhnya, sesuatu yang fungsi saat ini tidak dapat melakukan. Penggunaan istilah "prosedur tersimpan" dalam konteks ini tampaknya secara analogi dengan produk basis data lainnya. Lihat utas milis ini untuk ide yang tidak jelas.

Namun dalam praktiknya, perbedaan fungsi versus prosedur dalam hal kemampuan mengendalikan transaksi mereka tidak diterima secara universal, dan tentu saja banyak programmer tanpa bias basis data akan mengambil interpretasi mirip Pascal dari prosedur sebagai fungsi tanpa nilai balik. (Standar SQL tampaknya mengambil jalan tengah, dalam bahwa prosedur secara default memiliki perilaku transaksi yang berbeda dari fungsi, tetapi ini dapat disesuaikan per objek.) Jadi dalam hal apa pun, dan terutama ketika melihat pertanyaan di Stack Exchange dengan audiens yang sangat beragam, Anda harus menghindari asumsi terlalu banyak dan menggunakan istilah yang lebih jelas atau mendefinisikan properti yang Anda harapkan.

Peter Eisentraut
sumber
14

Dalam hal DDL, Postgres tidak memiliki objek prosedur, hanya berfungsi. Fungsi Postgres dapat mengembalikan nilai atau batal sehingga mereka mengambil peran dari kedua fungsi dan prosedur dalam RDBMS lainnya. Kata 'prosedur' dalam create triggermerujuk ke suatu fungsi.

Dalam hal dokumentasi Postgres, 'prosedur' juga merupakan sinonim untuk objek basis data yang disebut fungsi, misalnya: " Prosedur pemicu dibuat dengan perintah CREATE FUNCTION ".

'Prosedur' pemicu memang memiliki aturan tertentu: prosedur tersebut harus dinyatakan sebagai fungsi tanpa argumen dan jenis pemicu pengembalian . Contoh di sini .

Jack Douglas
sumber
8

Istilah "prosedur tersimpan" dan "fungsi tersimpan" digunakan secara bergantian dalam PostgreSQL dan umumnya dianggap memiliki arti yang sama. Database lain dapat membedakan antara prosedur dan fungsi (seperti halnya VB membedakan antara subrutin dan fungsi).

Selama suatu fungsi dalam PostgreSQL mengembalikan sesuatu yang menyerupai tabel, Anda dapat menggunakan output dari fungsi itu seolah-olah itu adalah tabel standar. ItuCREATE TRIGGER sintaks adalah sedikit membingungkan, tapi saya menduga mungkin telah di tempat sebelum standar ANSI diselesaikan. Saya hanya memiliki salinan SQL: 2003, jadi saya tidak bisa melakukan lebih dari berspekulasi mengapa nomenklaturnya aneh.

TL; versi DR: dengan PostgreSQL "prosedur" setara dengan "fungsi".

Jeremiah Peschka
sumber
6

Dalam MSSQL, prosedur tersimpan adalah seperangkat perintah sql yang telah dikompilasi sebelumnya.
Prosedur tersimpan:

 - Dapat memiliki banyak parameter input dan output
 - dapat digunakan untuk memodifikasi tabel / struktur / data basis data
 - biasanya tidak digunakan di dalam pernyataan insert / update / delete / select
Fungsi yang ditentukan pengguna datang dalam beberapa rasa. Tergantung pada jenis fungsi yang ditulis, fungsi:
  - dapat memiliki beberapa parameter input, tetapi hanya mengembalikan nilai tunggal (yaitu penggabungan string)
  - dapat menerima set sebagai input, mengembalikan nilai tunggal (mis. dbo.FindLargestPig (ListOfPigs))
  - kembalikan tabel (mis. pilih * dari dbo.ExplodeString ("ini adalah daftar kata"))
  - dapat digunakan dalam pilih / masukkan / perbarui / hapus pernyataan
  - TIDAK BISA digunakan untuk memodifikasi tabel / struktur / data basis data

datagod
sumber
5

Jawaban singkatnya adalah suatu fungsi mengembalikan nilai, tetapi prosedur tidak.

Perbedaan itu hadir dalam Modul Persistent Stored (SQL / PSM), yang diusulkan untuk SQL 1992. Saya tidak tahu apakah SQL / PSM pernah membuatnya menjadi standar.

Mike Sherrill 'Cat Recall'
sumber
pada tahun 2003 saya percaya
xenoterracide
Kedengarannya sangat mirip dengan sintaks untuk VB. Suatu fungsi mengembalikan nilai dan prosedur tidak (jadi jika Anda memiliki nilai balik dalam suatu fungsi itu akan meledak pada kompiler)
jcolebrand
@ jcolebrand Sebenarnya, nama-nama lebih jelas dalam Pascal. Sebuah prosedur tidak mengembalikan hasilnya, sementara fungsi tidak. Untuk alasan historis, VBA menggunakan bahasa FORTRAN, yang memanggil (disebut?) Mereka SUBROUTINE & FUNGSI . Bahasa tipe C modern hanya memiliki fungsi, tetapi bahasa yang diketik memiliki opsi fungsi batal yang merupakan prosedur dengan nama lain. Tren populer adalah hanya menggunakan fungsi normal untuk semuanya dan mengembalikan sesuatu yang dapat diabaikan jika Anda mau.
Manngo
2

Membandingkan jawaban yang diterima dari level konseptual abstrak, saya memahami perbedaan dari perspektif fungsionalitas dan input / output. Di bawah ini saya menggunakan sp dan f untuk mewakili masing-masing prosedur dan fungsi yang tersimpan.

  1. Gunakan dalam ekspresi: sp tidak dapat digunakan dalam ekspresi sementara fungsi bisa, yang berarti Anda dapat menggunakan nilai Anda yang dikembalikan dari dalam pernyataan lain, seperti

    select * 
    from table 
    where col_a < (select col_A from f())
  2. mengembalikan nilai: sp tidak secara otomatis mengembalikan nilai kecuali jika Anda menentukan refcursor jenis kembali, terbuka dan kembali kursor; f mengembalikan hasil dalam pernyataan terakhir di mana klausa 'kembali' disematkan, seperti klausa pilih .

  3. mengembalikan set hasil tunggal / ganda: di sini set hasil merujuk daftar hasil yang mungkin berbeda dalam format, seperti set integer tunggal, array teks dan dua tabel. sp dapat mengembalikan beberapa set selama Anda menentukan jenis pengembalian kursor, buka dan mengembalikan kursor. Namun, f hanya dapat mengembalikan satu jenis set.

Biasanya, prosedur tersimpan digunakan untuk memodifikasi data atau struktur database di mana nilai kembali tidak diperlukan, seperti menghapus, memperbarui, menjatuhkan , dll; atau situasi di mana beberapa set hasil diperlukan. Fungsi, di sisi lain, sebagian besar dipilih untuk permintaan polos.

Untuk detail lebih lanjut mengenai penjelasan saya, silakan merujuk ke tautan ini: Prosedur dan Fungsi Tersimpan di PostgreSQL

jujur
sumber