Fungsi tersimpan prosedur vs MySQL, yang akan saya gunakan kapan?


160

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?

Jawaban:


101

Anda tidak dapat mencampur dalam prosedur tersimpan dengan SQL biasa, sementara dengan fungsi tersimpan Anda bisa.

misalnya SELECT get_foo(myColumn) FROM mytabletidak valid jika get_foo()merupakan prosedur, tetapi Anda dapat melakukannya jika get_foo()merupakan suatu fungsi. Harganya adalah bahwa fungsi memiliki lebih banyak batasan daripada prosedur.


18
Apa keterbatasan yang dimiliki fungsi?
Fantius

11
Ah, saya menemukan beberapa info bagus di sini: dev.mysql.com/doc/refman/5.0/en/…
Fantius

262

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

  1. Prosedur tidak mengembalikan nilai. Sebaliknya, itu dipanggil dengan pernyataan PANGGILAN untuk melakukan operasi seperti mengubah tabel atau memproses catatan yang diambil.
  2. Fungsi dipanggil dalam ekspresi dan mengembalikan nilai tunggal langsung ke pemanggil untuk digunakan dalam ekspresi.
  3. 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:

  1. 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.
  2. 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:

  1. ( 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.

  2. ( 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

  3. Fungsi biasanya digunakan untuk perhitungan sedangkan prosedur biasanya digunakan untuk mengeksekusi logika bisnis.

  4. 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

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

  6. 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.

  7. 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.


2
@GrijeshChauhan, Apa maksud Anda ketika Anda mengatakan bahwa "Function Parsed and compile at runtime" ?
Pacerier

@Pacerier berarti fungsi di MySQL adalah sesuatu seperti skrip yang dikompilasi dan dijalankan dengan cepat. Saya menyalinnya dari beberapa posting blog , tetapi tidak melakukan hal praktis untuk memeriksa perilaku ini.
Grijesh Chauhan

Dalam prosedur, Anda dapat membagikan variabel sebagai parameter, lalu memanggilnya dengan pernyataan pilih
LTroya

1
Poin # 4 di bagian bawah dari jawaban ini adalah, saya pikir, inti dari perbedaan antara prosedur dan fungsi. prosedur dapat mengubah database, fungsinya tidak bisa. semua perbedaan lainnya hanya untuk melayani tujuan itu dengan lebih efektif.
Woodrow Barlow

51

Satu perbedaan signifikan adalah bahwa Anda dapat memasukkan fungsi dalam kueri SQL Anda, tetapi prosedur tersimpan hanya dapat dipanggil dengan CALLpernyataan:

Contoh UDF:

CREATE FUNCTION hello (s CHAR(20))
   RETURNS CHAR(50) DETERMINISTIC
   RETURN CONCAT('Hello, ',s,'!');
Query OK, 0 rows affected (0.00 sec)

CREATE TABLE names (id int, name varchar(20));
INSERT INTO names VALUES (1, 'Bob');
INSERT INTO names VALUES (2, 'John');
INSERT INTO names VALUES (3, 'Paul');

SELECT hello(name) FROM names;
+--------------+
| hello(name)  |
+--------------+
| Hello, Bob!  |
| Hello, John! |
| Hello, Paul! |
+--------------+
3 rows in set (0.00 sec)

Contoh Sproc:

delimiter //

CREATE PROCEDURE simpleproc (IN s CHAR(100))
BEGIN
   SELECT CONCAT('Hello, ', s, '!');
END//
Query OK, 0 rows affected (0.00 sec)

delimiter ;

CALL simpleproc('World');
+---------------------------+
| CONCAT('Hello, ', s, '!') |
+---------------------------+
| Hello, World!             |
+---------------------------+
1 row in set (0.00 sec)

1
Fungsi Anda memiliki dua pengembalian ? Maksud saya apa garis ini? RETURNS CHAR(50) DETERMINISTIC?
Martin AJ

The RETURNS CHAR(50)negara apa jenis data akan dikembalikan. The RETURN CONCAT(...adalah data yang dikembalikan. Keduanya dibutuhkan. The DETERMINISTICdiperlukan untuk menyatakan bahwa data yang mendasari tidak akan diubah.
lemming622

8

Fungsi yang disimpan dapat digunakan dalam kueri. Anda kemudian dapat menerapkannya pada setiap baris, atau dalam klausa WHERE.

Prosedur dijalankan menggunakan permintaan PANGGILAN.


0

Prosedur tersimpan dapat disebut rekursif tetapi fungsi yang disimpan tidak bisa

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.