Saya melihat prosedur dan fungsi yang tersimpan di MySQL. Apa perbedaan sebenarnya?
Mereka tampaknya serupa, tetapi suatu fungsi memiliki lebih banyak keterbatasan.
Saya mungkin salah, tetapi tampaknya prosedur tersimpan dapat melakukan segalanya dan lebih banyak fungsi tersimpan bisa. Mengapa / kapan saya akan menggunakan prosedur vs fungsi?
mysql
stored-procedures
sql-function
Orang dgn nama yg tdk dikenal
sumber
sumber
Perbedaan paling umum antara prosedur dan fungsi adalah bahwa mereka dipanggil secara berbeda dan untuk tujuan yang berbeda:
Sintaks untuk pembuatan rutin agak berbeda untuk prosedur dan fungsi:
Fungsi mengembalikan nilai, jadi harus ada klausa RETURNS dalam definisi fungsi untuk menunjukkan tipe data dari nilai balik. Juga, harus ada setidaknya satu pernyataan RETURN dalam tubuh fungsi untuk mengembalikan nilai kepada pemanggil. RETURNS dan RETURN tidak muncul dalam definisi prosedur.
Untuk menjalankan prosedur tersimpan, gunakan
CALL statement
. Untuk memohon fungsi yang disimpan, lihat di dalam ekspresi. Fungsi mengembalikan nilai selama evaluasi ekspresi.Prosedur dipanggil menggunakan pernyataan PANGGILAN, dan hanya bisa mengembalikan nilai menggunakan variabel output. Suatu fungsi dapat dipanggil dari dalam pernyataan seperti halnya fungsi lain (yaitu, dengan memanggil nama fungsi), dan dapat mengembalikan nilai skalar.
Menentukan parameter sebagai IN, OUT, atau INOUT hanya valid untuk PROSEDUR. Untuk FUNGSI, parameter selalu dianggap sebagai parameter IN.
Jika tidak ada kata kunci yang diberikan sebelum nama parameter, itu adalah parameter IN secara default. Parameter untuk fungsi yang disimpan tidak didahului oleh IN, OUT, atau INOUT. Semua parameter fungsi diperlakukan sebagai parameter IN.
Untuk menentukan prosedur atau fungsi yang tersimpan, gunakan masing-masing CREATE PROCEDURE atau CREATE FUNCTION:
Ekstensi MySQL untuk prosedur tersimpan (bukan fungsi) adalah prosedur dapat menghasilkan set hasil, atau bahkan beberapa set hasil, yang pemanggil memproses dengan cara yang sama dengan hasil dari pernyataan SELECT. Namun, konten dari set hasil tersebut tidak dapat digunakan secara langsung dalam ekspresi.
Rutin yang disimpan (merujuk pada prosedur tersimpan dan fungsi tersimpan) dikaitkan dengan database tertentu, seperti tabel atau tampilan. Saat Anda menjatuhkan basis data, semua rutinitas yang tersimpan dalam basis data juga dihapus.
Prosedur dan fungsi yang disimpan tidak memiliki ruang nama yang sama. Dimungkinkan untuk memiliki prosedur dan fungsi dengan nama yang sama dalam database.
Dalam Stored procedure, SQL dinamis dapat digunakan tetapi tidak dalam fungsi atau pemicu.
Beberapa perbedaan yang lebih menarik antara FUNGSI dan PROSEDUR TERSimpan:
( Poin ini disalin dari blogpost . ) Prosedur tersimpan adalah rencana eksekusi yang dikompilasi di mana fungsinya tidak. Fungsi Parsed dan dikompilasi pada saat runtime. Disimpan prosedur, Disimpan sebagai pseudo-code dalam database yaitu formulir terkompilasi.
( Saya tidak yakin untuk titik ini. )
Prosedur tersimpan memiliki keamanan dan mengurangi lalu lintas jaringan dan juga kita dapat memanggil prosedur tersimpan dalam no. aplikasi pada suatu waktu. referensi
Fungsi biasanya digunakan untuk perhitungan sedangkan prosedur biasanya digunakan untuk mengeksekusi logika bisnis.
Fungsi Tidak dapat mempengaruhi keadaan database (Laporan yang melakukan eksplisit atau implisit melakukan atau rollback yang dianulir dalam fungsi) Sedangkan prosedur tersimpan Bisa mempengaruhi keadaan database menggunakan komit dll
refrence: J.1. Pembatasan Rutin yang Disimpan dan Pemicu
Fungsi tidak dapat menggunakan pernyataan FLUSH sedangkan prosedur tersimpan dapat melakukannya.
Fungsi yang disimpan tidak dapat bersifat rekursif, sedangkan prosedur yang tersimpan dapat. Catatan: Prosedur tersimpan rekursif dinonaktifkan secara default, tetapi dapat diaktifkan di server dengan mengatur variabel sistem server max_sp_recursion_depth ke nilai bukan nol. Lihat Bagian 5.2.3, “Variabel Sistem” , untuk informasi lebih lanjut.
Di dalam fungsi tersimpan atau pemicu, tidak diizinkan untuk mengubah tabel yang sudah digunakan (untuk membaca atau menulis) dengan pernyataan yang memanggil fungsi atau pemicu. Contoh Baik: Bagaimana cara Memperbarui tabel yang sama pada penghapusan di MYSQL?
Catatan : bahwa meskipun beberapa pembatasan biasanya berlaku untuk fungsi yang disimpan dan pemicu tetapi tidak untuk prosedur yang tersimpan, pembatasan tersebut berlaku untuk prosedur yang tersimpan jika mereka dipanggil dari dalam fungsi atau pemicu yang tersimpan. Misalnya, meskipun Anda dapat menggunakan FLUSH dalam prosedur tersimpan, prosedur tersimpan tersebut tidak dapat dipanggil dari fungsi tersimpan atau pemicu.
sumber
Satu perbedaan signifikan adalah bahwa Anda dapat memasukkan fungsi dalam kueri SQL Anda, tetapi prosedur tersimpan hanya dapat dipanggil dengan
CALL
pernyataan:Contoh UDF:
Contoh Sproc:
sumber
RETURNS CHAR(50) DETERMINISTIC
?RETURNS CHAR(50)
negara apa jenis data akan dikembalikan. TheRETURN CONCAT(...
adalah data yang dikembalikan. Keduanya dibutuhkan. TheDETERMINISTIC
diperlukan untuk menyatakan bahwa data yang mendasari tidak akan diubah.Fungsi yang disimpan dapat digunakan dalam kueri. Anda kemudian dapat menerapkannya pada setiap baris, atau dalam klausa WHERE.
Prosedur dijalankan menggunakan permintaan PANGGILAN.
sumber
Prosedur tersimpan dapat disebut rekursif tetapi fungsi yang disimpan tidak bisa
sumber