Объявить курсор динамически - PullRequest
1 голос
/ 06 января 2012

Мне нужно динамически создавать курсоры в хранимой процедуре в зависимости от ситуации, в которой я нахожусь, идеал ниже:

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;

Приведенный выше код вызовет синтаксическую ошибку. Я погуглил, и кто-то сделал это, используя временную таблицу. Может кто-нибудь сказать мне, как пожалуйста?

1 Ответ

6 голосов
/ 06 января 2012

Вероятно, вы нашли в Google то, что создали временную таблицу, заполнили эту временную таблицу, основываясь на своем предикате, а затем ссылались на временную таблицу в объявлении курсора.

Примерно так:

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 ;
...