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

Kursor prosedur tersimpan MySQL untuk pernyataan yang disiapkan

Saya punya kabar buruk dan baik untuk Anda.

Pertama, berita buruknya.

Jadi sejauh ini tidak ada kursor dinamis... Di sini Anda memerlukan sesuatu seperti ini.

Tapi sekarang kabar baiknya:setidaknya ada dua cara untuk mem-bypassnya - menggunakan vw atau tbl.

Di bawah ini saya menulis ulang kode Anda dan menerapkan tampilan untuk membuat kursor 'dinamis'.

DELIMITER //

DROP PROCEDURE IF EXISTS myproc;
CREATE PROCEDURE myproc(IN lang VARCHAR(400))

BEGIN

    DECLARE c VARCHAR(400);
    DECLARE done BOOLEAN DEFAULT FALSE;
    DECLARE cur CURSOR FOR SELECT name FROM vw_myproc;
    DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;

    SET @select = concat('CREATE VIEW vw_myproc as SELECT * FROM ', lang, ' limit 3');
    PREPARE stm FROM @select;
    EXECUTE stm;
    DEALLOCATE PREPARE stm;

    SET @select = concat('SELECT * FROM ', lang, ' limit 3');
    PREPARE stm FROM @select;
    EXECUTE stm;
    DEALLOCATE PREPARE stm;

    SET @cnt = FOUND_ROWS(); 
    SELECT @cnt;
    IF @cnt = 3 THEN
          OPEN cur;
          read_loop: LOOP
            FETCH cur INTO c;
            IF done THEN
              LEAVE read_loop;
            END IF;

            #HERE YOU CAN DO STH WITH EACH ROW e.g. UPDATE; INSERT; DELETE etc
            SELECT c;

          END LOOP read_loop;
          CLOSE cur;
          DROP VIEW vw_myproc;
    ELSE
        SET c = '';
    END IF;

END//

DELIMITER ;

Dan untuk menguji prosedurnya:

CALL myproc('people_en');


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Apa manfaat zerofill di MySQL?

  2. Bagaimana cara mengganti nama file yang diunggah sebelum menyimpannya ke dalam direktori?

  3. Laravel:mendapatkan satu nilai dari kueri MySQL

  4. Mysql :membuang database bersama data

  5. ubah mesin default mysql menjadi innodb