Bagaimana cara MySQL mengembalikan hasil yang ditetapkan dari prosedur tersimpan?

16

Saya mencoba mencari tahu tentang prosedur tersimpan untuk digunakan dalam aplikasi web. Tampak bagi saya bahwa apa pun pernyataan terakhir dalam prosedur tersimpan MySQL tampaknya akan diperlakukan sebagai set hasil prosedur itu. Sayangnya, tampaknya ada referensi dalam dokumen MySQL yang mengatakan bahwa suatu prosedur dapat mengembalikan beberapa set hasil. Bagaimana perilaku ini dipicu? Bagaimana saya bisa memberi tahu server MySQL bahwa saya secara eksplisit ingin hanya satu set hasil yang dikembalikan?

(Misalnya, saya memiliki permintaan yang melakukan SELECT dan beberapa sisipan. Saya tidak ingin memberi tahu klien tentang sisipan, tetapi saya ingin klien diberi set hasil SELECT ....)

Billy ONeal
sumber

Jawaban:

17

Setiap pernyataan SELECT yang tidak dimasukkan ke dalam tabel atau variabel akan menghasilkan set hasil.

Jika Anda ingin prosedur tersimpan Anda hanya mengembalikan satu set hasil, pastikan Anda hanya memiliki satu pernyataan SELECT. Jika Anda memiliki pernyataan SELECT lainnya, pastikan bahwa mereka memasukkan hasil ke dalam tabel atau variabel.

PEMBARUAN
Berikut adalah contoh prosedur tersimpan.

Prosedur tersimpan ini akan mengembalikan satu set hasil:

DELIMITER ;;
CREATE DEFINER=CURRENT_USER PROCEDURE stored_procedure_name()
BEGIN
    DECLARE local_variable_name INT;

    SELECT column_name FROM table_1 LIMIT 1 INTO local_variable_name;

    SELECT * FROM table_1;
END;;
DELIMITER ;

Prosedur tersimpan ini akan mengembalikan dua set hasil:

DELIMITER ;;
CREATE DEFINER=CURRENT_USER PROCEDURE stored_procedure_name()
BEGIN
    DECLARE local_variable_name INT;

    SELECT column_name FROM table_1 LIMIT 1 INTO local_variable_name;

    SELECT * FROM table_1;

    SELECT * FROM table_2;
END;;
DELIMITER ;
dabest1
sumber
Ah, jadi jika masuk ke tabel atau variabel, itu tidak dimasukkan sebagai hasilnya? Bagaimana seseorang mengaksesnya; menggunakan misalnya SELECT INTO?
Billy ONeal
Ya untuk pertanyaan pertama. Saya tidak jelas pada pertanyaan kedua Anda. Jika saya ingin menyimpan nilai ke variabel lokal dari dalam prosedur yang tersimpan, saya menjalankan sesuatu seperti ini: SELECT column_name LIMIT 1 INTO local_variable_name;.
dabest1
Permintaan contoh di atas seharusnya: SELECT column_name FROM table LIMIT 1 INTO local_variable_name;.
dabest1
jika saya ingin mendapatkan variabel setelah panggilan disimpan_procedure_name dari prosedur tersimpan lainnya, saya tidak dapat mengatur hasil = panggilan disimpan_procedure_name () ;, bagaimana cara mengatasinya? jika saya menggunakan kursor, DECLARE c_dept CURSOR FOR panggilan get_info_user_visitstatistics () kesalahan sintaksis
Amitābha