sql >> Databáze >  >> RDS >> Mysql

Dynamický kurzor v uložené proceduře

Z příručky MySQL

Existují však 2 způsoby.

První je pro případy, kdy bude proceduru spouštět absolutně pouze jeden uživatel. Příkaz Prepare lze použít k vytvoření pohledu s dynamickým SQL a kurzor může vybírat z tohoto staticky pojmenovaného pohledu. Nemá to téměř žádný vliv na výkon. Bohužel tato zobrazení jsou viditelná i pro ostatní uživatele (neexistuje nic takového jako dočasné zobrazení), takže to nebude fungovat pro více uživatelů.

Analogicky lze v příkazu Prepare vytvořit dočasnou tabulku a kurzor vybrat z dočasné tabulky. Dočasnou tabulku vidí pouze aktuální relace, takže problém s více uživateli je vyřešen. Toto řešení však může mít významný dopad na výkon, protože při každém spuštění proc musí být vytvořena dočasná tabulka.

Sečteno a podtrženo:Stále potřebujeme kurzory, abychom je mohli vytvářet dynamicky!

Zde je příklad použití zobrazení k předání názvu tabulky a názvu sloupce do kurzoru z fóra 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. To-do list aplikace využívající PHP a MySQL databázi

  2. Svatý grál čištění vstupu a výstupu v php?

  3. Jak spouštět php skript automaticky denně?

  4. Proč ISNUMERIC('.') vrací 1?