Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Dynamiczny kursor w procedurze składowanej

Z Podręcznika MySQL

Istnieją jednak 2 sposoby.

Pierwszy dotyczy przypadków, w których procedurę będzie uruchamiał tylko jeden użytkownik naraz. Do utworzenia widoku z dynamicznym SQL można użyć instrukcji przygotowania, a kursor może wybrać widok z tego statycznie nazwanego widoku. Nie ma prawie żadnego wpływu na wydajność. Niestety te widoki są również widoczne dla innych użytkowników (nie ma czegoś takiego jak widok tymczasowy), więc nie będzie to działać dla wielu użytkowników.

Analogicznie w instrukcji przygotowania można utworzyć tabelę tymczasową, a kursorem można wybrać z tabeli tymczasowej. Tylko bieżąca sesja może zobaczyć tabelę tymczasową, więc problem wielu użytkowników został rozwiązany. Ale to rozwiązanie może mieć znaczący wpływ na wydajność, ponieważ tabela tymczasowa musi być tworzona za każdym razem, gdy uruchamiany jest proc.

Konkluzja:Nadal potrzebujemy kursorów, aby móc tworzyć dynamicznie!

Oto przykład użycia widoku do przekazania nazwy tabeli i nazwy kolumny do kursora z fora mysql

DELIMITER // 
DROP PROCEDURE IF EXISTS test_prepare// 

CREATE PROCEDURE test_prepare(IN tablename varchar(255), columnname varchar(50)) 
BEGIN 
DECLARE cursor_end CONDITION FOR SQLSTATE '02000'; 
DECLARE v_column_val VARCHAR(50); 
DECLARE done INT DEFAULT 0; 
DECLARE cur_table CURSOR FOR SELECT * FROM test_prepare_vw; 
DECLARE CONTINUE HANDLER FOR cursor_end SET done = 1; 

SET @query = CONCAT('CREATE VIEW test_prepare_vw as select ', columnname, ' from ', tablename); 
select @query; 
PREPARE stmt from @query; 
EXECUTE stmt; 
DEALLOCATE PREPARE stmt; 

OPEN cur_table; 
FETCH cur_table INTO v_column_val; 
WHILE done = 0 DO 
SELECT v_column_val; 
FETCH cur_table INTO v_column_val; 
END WHILE; 
CLOSE cur_table; 

DROP VIEW test_prepare_vw; 

END; 
// 

DELIMITER ;



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Kod migracji specyficzny dla bazy danych

  2. Jak naprawić błąd MySQL 1064?

  3. pole zamówienia mysql varchar jako liczba całkowita

  4. mysql:wybierz wszystkie elementy z tabeli A, jeśli nie istnieją w tabeli B

  5. Łączenie tabel w MySql z jednym wspólnym polem, ale różnymi wartościami wspólnego pola