sql >> Database teknologi >  >> RDS >> Mysql

Dynamisk markør i lagret procedure

Fra MySQL Manual

Der er dog 2 måder.

Den første er til tilfælde, hvor absolut kun én bruger ad gangen vil køre proceduren. En prepare-sætning kan bruges til at oprette en visning med den dynamiske SQL, og markøren kan vælge fra denne statisk navngivne visning. Der er næsten ingen effekt på ydeevnen. Desværre er disse visninger også synlige for andre brugere (der er ikke sådan noget som en midlertidig visning), så dette vil ikke fungere for flere brugere.

Analogt kan en midlertidig tabel oprettes i prepare-sætningen, og markøren kan vælge fra den midlertidige tabel. Kun den aktuelle session kan se en midlertidig tabel, så problemet med flere brugere er løst. Men denne løsning kan have betydelig indvirkning på ydeevnen, da der skal oprettes en midlertidig tabel hver gang procen kører.

Nederste linje:Vi mangler stadig markører for at kunne skabes dynamisk!

Her er et eksempel på brug af en visning til at overføre tabelnavnet og kolonnenavnet til en markør fra mysql-fora

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. Advarsel:mysql_query():3 er ikke en gyldig MySQL-Link-ressource

  2. MaxListenersExceededWarning:Mulig EventEmitter-hukommelseslækage detekteret. 11 meddelelseslyttere tilføjet. Brug emitter.setMaxListeners() for at øge grænsen

  3. IRI-Windocks Test Database Repository

  4. Hvordan øger man de maksimale forbindelser i postgres?