Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

Prosedur tersimpan MySQL vs fungsi, mana yang akan saya gunakan kapan?

Perbedaan paling umum antara prosedur dan fungsi adalah bahwa mereka dipanggil secara berbeda dan untuk tujuan yang berbeda:

  1. Prosedur tidak mengembalikan nilai. Sebagai gantinya, ia dipanggil dengan pernyataan CALL untuk melakukan operasi seperti memodifikasi tabel atau memproses catatan yang diambil.
  2. Sebuah fungsi dipanggil dalam ekspresi dan mengembalikan nilai tunggal langsung ke pemanggil untuk digunakan dalam ekspresi.
  3. Anda tidak dapat memanggil fungsi dengan pernyataan CALL, Anda juga tidak dapat memanggil prosedur dalam ekspresi.

Sintaks untuk pembuatan rutin agak berbeda untuk prosedur dan fungsi:

  1. Parameter prosedur dapat didefinisikan sebagai input saja, output saja, atau keduanya. Ini berarti bahwa suatu prosedur dapat meneruskan nilai kembali ke pemanggil dengan menggunakan parameter keluaran. Nilai-nilai ini dapat diakses dalam pernyataan yang mengikuti pernyataan CALL. Fungsi hanya memiliki parameter input. Akibatnya, meskipun prosedur dan fungsi dapat memiliki parameter, deklarasi parameter prosedur berbeda dengan deklarasi fungsi.
  2. Fungsi mengembalikan nilai, jadi harus ada klausa RETURNS dalam definisi fungsi untuk menunjukkan tipe data dari nilai yang dikembalikan. Juga, harus ada setidaknya satu pernyataan RETURN di dalam badan fungsi untuk mengembalikan nilai ke pemanggil. RETURNS dan RETURN tidak muncul dalam definisi prosedur.

    • Untuk memanggil prosedur tersimpan, gunakan CALL statement . Untuk memanggil fungsi tersimpan, rujuk ke dalam ekspresi. Fungsi mengembalikan nilai selama evaluasi ekspresi.

    • Prosedur dipanggil menggunakan pernyataan CALL, dan hanya dapat meneruskan nilai menggunakan variabel keluaran. Sebuah fungsi dapat dipanggil dari dalam pernyataan sama seperti fungsi lainnya (yaitu, dengan memanggil nama fungsi), dan dapat mengembalikan nilai skalar.

    • Menentukan parameter sebagai IN, OUT, atau INOUT hanya valid untuk PROSEDUR. Untuk FUNCTION, 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 tersimpan, gunakan CREATE PROCEDURE atau CREATE FUNCTION masing-masing:

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 bahwa prosedur dapat menghasilkan kumpulan hasil, atau bahkan beberapa kumpulan hasil, yang diproses oleh pemanggil dengan cara yang sama seperti hasil pernyataan SELECT. Namun, isi dari kumpulan hasil tersebut tidak dapat digunakan secara langsung dalam ekspresi.

Rutinitas tersimpan (mengacu pada prosedur tersimpan dan fungsi tersimpan) diasosiasikan dengan database tertentu, seperti tabel atau tampilan. Saat Anda menghapus database, rutinitas yang tersimpan dalam database juga akan 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 prosedur Tersimpan SQL dinamis dapat digunakan tetapi tidak dalam fungsi atau pemicu.

Pernyataan yang disiapkan SQL (SIAPKAN, JALANKAN, DEALLOKASI SIAPKAN) dapat digunakan dalam prosedur tersimpan, tetapi bukan fungsi atau pemicu yang disimpan. Dengan demikian, fungsi dan pemicu yang disimpan tidak dapat menggunakan SQL Dinamis (di mana Anda membuat pernyataan sebagai string dan kemudian menjalankannya). (SQL Dinamis dalam rutinitas tersimpan MySQL )

Beberapa perbedaan yang lebih menarik antara FUNCTION dan STORED PROCEDURE:

  1. (Poin ini adalah disalin dari entri blog . ) Prosedur tersimpan adalah rencana eksekusi yang telah dikompilasi sebelumnya sedangkan fungsi tidak. Fungsi Diurai dan dikompilasi saat runtime. Prosedur tersimpan, Disimpan sebagai kode semu dalam database yaitu formulir yang dikompilasi.

  2. (Saya tidak yakin untuk hal ini. )
    Prosedur tersimpan memiliki keamanan dan mengurangi lalu lintas jaringan dan juga kita dapat memanggil prosedur tersimpan di no. dari aplikasi pada suatu waktu. referensi

  3. Fungsi biasanya digunakan untuk komputasi di mana prosedur biasanya digunakan untuk mengeksekusi logika bisnis.

  4. Fungsi Tidak dapat memengaruhi status basis data (Pernyataan yang melakukan komit atau rollback eksplisit atau implisit tidak diizinkan dalam fungsi) Sedangkan prosedur Tersimpan Dapat memengaruhi status basis data menggunakan komit, dll.
    referensi:J.1. Pembatasan pada Rutinitas dan Pemicu yang Disimpan

  5. Fungsi tidak dapat menggunakan FLUSH pernyataan sedangkan prosedur Tersimpan dapat melakukannya.

  6. Fungsi tersimpan tidak dapat rekursif Sedangkan Prosedur tersimpan dapat. Catatan:Prosedur tersimpan rekursif dinonaktifkan secara default, tetapi dapat diaktifkan di server dengan menyetel variabel sistem server max_sp_recursion_depth ke nilai bukan nol. Lihat Bagian 5.2.3 , “Variabel Sistem” , untuk informasi lebih lanjut.

  7. Di dalam fungsi atau pemicu yang tersimpan, tidak diizinkan untuk mengubah tabel yang sudah digunakan (untuk membaca atau menulis) dengan pernyataan yang memanggil fungsi atau pemicu. Contoh yang Baik:Bagaimana Cara Memperbarui tabel yang sama saat dihapus di MYSQL?

Catatan :bahwa meskipun beberapa pembatasan biasanya berlaku untuk fungsi dan pemicu tersimpan tetapi tidak untuk prosedur tersimpan, pembatasan tersebut berlaku untuk prosedur tersimpan jika dipanggil dari dalam fungsi atau pemicu tersimpan. Misalnya, meskipun Anda dapat menggunakan FLUSH dalam prosedur tersimpan, prosedur tersimpan seperti itu tidak dapat dipanggil dari fungsi atau pemicu yang tersimpan.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Mengapa saya tidak menggunakan fungsi mysql_* di PHP?

  2. Bagaimana cara menghapus semua karakter numerik non-alfa dari string di MySQL?

  3. Praktik Terbaik Replikasi MySQL

  4. Cara menggunakan indeks untuk meningkatkan kinerja kueri MySQL

  5. Bagaimana Anda menghapus MySQL dari Mac OS X?