2 votes

Déclarer le curseur dynamiquement

J'ai besoin de créer des curseurs dynamiquement dans une procédure stockée en fonction de la situation dans laquelle je me trouve, l'idéal est le suivant :

IF (varOrgGroupCode = '') THEN
BEGIN
DECLARE groupCode CURSOR FOR
SELECT `groupcode` FROM `LICENSEKEYS`;
END;
ELSE
BEGIN
DECLARE groupCode CURSOR FOR
SELECT `groupcode` FROM `LICENSEKEYS` WHERE `groupcode` = varOrgGroupCode;  
END;
END IF;

Le code ci-dessus provoquera une erreur de syntaxe. J'ai cherché sur Google et quelqu'un l'a fait en utilisant une table temporaire. Quelqu'un peut-il me dire comment faire ?

6voto

Tom Mac Points 5104

Ce que vous avez probablement trouvé sur Google, c'est de créer une table temporaire, de remplir cette table temporaire en fonction de votre prédicat, puis de faire référence à la table temporaire dans votre déclaration de curseur.

Algo así:

DELIMITER $$

CREATE PROCEDURE `some_procedure`(IN varOrgGroupCode varchar(100))
BEGIN

DECLARE bNoMoreRows BOOLEAN DEFAULT FALSE;
DECLARE vGroupCode varchar(100);

DECLARE groupCode CURSOR FOR
SELECT `groupcode` FROM `LICENSEKEYS_TEMP`;

declare continue handler for not found set bNoMoreRows := true; 

BEGIN

  drop table if exists LICENSEKEYS_TEMP;

  create temporary table `LICENSEKEYS_TEMP` (groupCode varchar(100));

  IF (varOrgGroupCode = '') THEN
    insert into `LICENSEKEYS_TEMP` (groupCode) SELECT `groupcode` FROM `LICENSEKEYS`;
  ELSE
    insert into `LICENSEKEYS_TEMP` (groupCode) SELECT `groupcode` FROM `LICENSEKEYS` WHERE `groupcode` = varOrgGroupCode;  
  END IF;

  open groupCode;

  GROUPCODE_LOOP: loop

   fetch groupCode into vGroupCode;

   -- Do some stuff

   if bNoMoreRows then
      close groupCode;
      leave GROUPCODE_LOOP;
   end if;

  END LOOP GROUPCODE_LOOP;

 END;

END$$

DELIMITER ;

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X