Perbedaan paling umum antara prosedur dan fungsi adalah bahwa mereka dipanggil secara berbeda dan untuk tujuan yang berbeda:
- Prosedur tidak mengembalikan nilai. Sebaliknya, itu dipanggil dengan pernyataan PANGGILAN untuk melakukan operasi seperti mengubah tabel atau memproses catatan yang diambil.
- Fungsi dipanggil dalam ekspresi dan mengembalikan nilai tunggal langsung ke pemanggil untuk digunakan dalam ekspresi.
- Anda tidak dapat menjalankan fungsi dengan pernyataan PANGGILAN, Anda juga tidak dapat menjalankan prosedur dalam ekspresi.
Sintaks untuk pembuatan rutin agak berbeda untuk prosedur dan fungsi:
- Parameter prosedur dapat didefinisikan sebagai hanya input, output saja, atau keduanya. Ini berarti bahwa suatu prosedur dapat meneruskan nilai kembali ke pemanggil dengan menggunakan parameter output. Nilai-nilai ini dapat diakses dalam pernyataan yang mengikuti pernyataan CALL. Fungsi hanya memiliki parameter input. Akibatnya, meskipun kedua prosedur dan fungsi dapat memiliki parameter, pernyataan parameter prosedur berbeda dari untuk 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:
CREATE PROCEDURE proc_name ([parameters])
[characteristics]
routine_body
CREATE FUNCTION func_name ([parameters])
RETURNS data_type // diffrent
[characteristics]
routine_body
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.
Pernyataan disiapkan SQL (SIAPKAN, LAKUKAN, DEALOKASI SIAPKAN) dapat digunakan dalam prosedur yang tersimpan, tetapi tidak fungsi atau pemicu yang tersimpan. Dengan demikian, fungsi dan pemicu yang disimpan tidak dapat menggunakan SQL Dinamis (tempat Anda membuat pernyataan sebagai string dan kemudian menjalankannya). (Dynamic SQL dalam rutinitas tersimpan MySQL)
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.