sql >> Database >  >> RDS >> Mysql

Dynamische cursor in opgeslagen procedure

Uit de MySQL-handleiding

Er zijn echter 2 manieren.

De eerste is voor gevallen waarin absoluut slechts één gebruiker tegelijk de procedure zal uitvoeren. Een prepare-instructie kan worden gebruikt om een ​​weergave te maken met de dynamische SQL en de cursor kan selecteren uit deze statisch benoemde weergave. Er is bijna geen invloed op de prestaties. Helaas zijn deze weergaven ook zichtbaar voor andere gebruikers (er bestaat niet zoiets als een tijdelijke weergave), dus dit werkt niet voor meerdere gebruikers.

Op analoge wijze kan een tijdelijke tabel worden gemaakt in de voorbereidingsopdracht en kan de cursor kiezen uit de tijdelijke tabel. Alleen de huidige sessie kan een tijdelijke tabel zien, dus het probleem met meerdere gebruikers is opgelost. Maar deze oplossing kan een aanzienlijke prestatie-impact hebben, aangezien er een tijdelijke tabel moet worden gemaakt telkens wanneer de procedure wordt uitgevoerd.

Bottom line:we hebben nog steeds cursors nodig om dynamisch te kunnen worden gemaakt!

Hier is een voorbeeld van het gebruik van een weergave om de tabelnaam en kolomnaam door te geven aan een cursor van de mysql-forums

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. Verbindingsbeheer in PostgreSQL:een gids

  2. LAAD DATA INFILE Foutcode:13

  3. Alle tabellen in een Postgres-database afkappen

  4. Als ik verbinding maak met mijn externe SQL-server, krijg ik toegang geweigerd voor gebruiker [email protected] (Wachtwoord gebruiken:Ja)