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

Panggil prosedur tersimpan untuk setiap baris yang dikembalikan oleh kueri di MySQL

Konsep seperti "loop" (untuk masing-masing, while, dll) dan "branching" (if-else, call, dll) adalah prosedural dan tidak ada di deklaratif bahasa seperti SQL. Biasanya seseorang dapat mengungkapkan hasil yang diinginkan dengan cara deklaratif, yang akan menjadi cara yang tepat untuk menyelesaikan masalah ini.

Misalnya, jika testProc prosedur yang akan dipanggil menggunakan id yang diberikan sebagai kunci pencarian ke tabel lain, maka Anda dapat (dan seharusnya) sebagai gantinya cukup JOIN tabel Anda bersama-sama—misalnya:

SELECT ...
FROM   objects JOIN other USING (id)
WHERE  ...

Hanya dalam situasi yang sangat jarang di mana masalah Anda tidak dapat diungkapkan secara deklaratif, Anda harus menggunakan pemecahannya secara prosedural. prosedur yang tersimpan adalah satu-satunya cara untuk mengeksekusi kode prosedural di MySQL. Jadi, Anda perlu memodifikasi sproc yang ada sehingga menjalankan logika saat ini dalam satu lingkaran, atau membuat sproc baru yang memanggil yang sudah ada dari dalam satu lingkaran:

CREATE PROCEDURE foo() BEGIN
  DECLARE done BOOLEAN DEFAULT FALSE;
  DECLARE _id BIGINT UNSIGNED;
  DECLARE cur CURSOR FOR SELECT id FROM objects WHERE ...;
  DECLARE CONTINUE HANDLER FOR NOT FOUND SET done := TRUE;

  OPEN cur;

  testLoop: LOOP
    FETCH cur INTO _id;
    IF done THEN
      LEAVE testLoop;
    END IF;
    CALL testProc(_id);
  END LOOP testLoop;

  CLOSE cur;
END



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Pisahkan nilai string yang dibatasi menjadi baris

  2. Bagaimana cara mengurutkan berdasarkan tanggal sebelumnya dalam database?

  3. MySQL INNER GABUNG Alias

  4. Normalisasikan Semua Karakter UTF8 ke dalam format paling standar

  5. Pustaka Javascript yang memungkinkan kueri seperti SQL pada data JSON?