sql >> Databasteknik >  >> RDS >> Mysql

Dynamisk markör i lagrad procedur

Från MySQL-manualen

Det finns dock två sätt.

Den första är för fall där absolut bara en användare åt gången kommer att köra proceduren. En prepare-sats kan användas för att skapa en vy med dynamisk SQL och markören kan välja från denna statiskt namngivna vy. Det är nästan ingen prestandapåverkan. Tyvärr är dessa vyer också synliga för andra användare (det finns inget sådant som en tillfällig vy), så detta fungerar inte för flera användare.

Analogt kan en temporär tabell skapas i prepare-satsen och markören kan välja från den temporära tabellen. Endast den aktuella sessionen kan se en tillfällig tabell, så problemet med flera användare är löst. Men den här lösningen kan ha betydande prestandapåverkan eftersom en temporär tabell måste skapas varje gång proc körs.

Summa summarum:Vi behöver fortfarande markörer för att kunna skapas dynamiskt!

Här är ett exempel på hur du använder en vy för att skicka tabellnamnet och kolumnnamnet till en markör från mysql-forum

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. Konfigurera en lokal SQL Server-databas

  2. Möjliga sätt att åtgärda problem med korruption av SQL Server-metadata

  3. Vad är skillnaden mellan att använda INDEX vs KEY i MySQL?

  4. Vad är det snabbaste sättet att få en MySQL-tabell efter nya rader?