it-swarm.asia

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

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

Tautan komentar ke artikel wikipedia tetapi beberapa di antaranya sepertinya tidak berlaku (mis. Bahwa mereka dapat digunakan dalam pernyataan SELECT).

The sintaks sendiri agak 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 FUNCTION tetapi menyebutnya sebagai PROCEDURE.

Jadi apa bedanya keduanya?

37
DrColossos

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. Fitur apa pun 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 mirip fungsi yang dapat memulai dan menghentikan transaksi dalam tubuhnya, sesuatu yang tidak bisa dilakukan fungsi saat ini. melakukan. Penggunaan istilah "prosedur tersimpan" dalam konteks ini tampaknya secara analogi dengan produk basis data lainnya. Lihat milis ini utas untuk gagasan 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 menggunakan interpretasi mirip prosedur prosedur sebagai fungsi tanpa nilai balik. (Standar SQL tampaknya mengambil jalan tengah, dalam hal prosedur oleh default memiliki perilaku transaksi yang berbeda dari fungsi, tetapi ini dapat disesuaikan menurut 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.

44
Peter Eisentraut

Dalam hal DDL, Postgres tidak memiliki objek prosedur, hanya berfungsi. Fungsi Postgres dapat mengembalikan nilai atau batal sehingga mengambil peran dari kedua fungsi dan prosedur dalam RDBMS lainnya. Kata 'prosedur' dalam create trigger mengacu pada 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 khusus: mereka harus dinyatakan sebagai fungsi tanpa argumen dan jenis pemicu pengembalian . Contoh di sini .

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 bagaimana 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. CREATE TRIGGER sintaks agak membingungkan, tetapi saya menduga mungkin sudah ada 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 "prosedur" PostgreSQL setara dengan "fungsi".

8
Jeremiah Peschka

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 database 
 - biasanya tidak digunakan di dalam pernyataan insert/update/delete/select 
 - dapat memiliki beberapa parameter input, tetapi hanya mengembalikan nilai tunggal (yaitu rangkaian 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 database 
6
datagod

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.

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 yang dikembalikan dari f di 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 Anda menentukan kursor kembali ketik kembali, buka dan kembalikan kursor; f mengembalikan hasil dalam pernyataan terakhir di mana klausa 'return' disematkan, seperti klausa select .

  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 basis data di mana nilai kembali tidak diperlukan, seperti hapus, perbarui, lepas , 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

2
Frank

Perhatikan bahwa dalam PostgreSQL 11, prosedur tersimpan ditambahkan sebagai objek skema baru. Anda dapat membuat procudure baru dengan menggunakan CREATE PROCEDURE pernyataan.

Prosedur tersimpan berbeda dari fungsi dengan cara berikut:

  • Prosedur tersimpan tidak memiliki nilai balik
  • Anda dapat melakukan dan mengembalikan transaksi di dalam prosedur tersimpan, tetapi tidak dalam fungsi
  • Anda menjalankan prosedur tersimpan menggunakan pernyataan CALL bukan pernyataan SELECT.
1
d4nyll