Mysql程序。更新并选择

时间:2013-12-27 18:04:57

标签: mysql select stored-procedures sql-update resultset

我有一个过程调用,它会更新一组数据,然后返回我要渲染的数据集。一切正常,除了,我不能同时做两个操作。如果我进行更新,那么程序将不返回任何值,反之亦然。我看到一些建议使用临时表的答案,但我找不到如何检索数据集。即使是改进我的查询,我也感谢任何帮助。

CREATE DEFINER=`root`@`localhost` PROCEDURE `prueba`(IN `idUsuario` INT)
MODIFIES SQL DATA

BEGIN

DECLARE flag INT DEFAULT FALSE;
DECLARE done INT DEFAULT FALSE;
DECLARE idNotificacion INT DEFAULT 0;
DECLARE cont INT DEFAULT 0;
DECLARE resultset CURSOR FOR SELECT id FROM notificaciones WHERE involvedA_idUsuario=idUsuario AND active=1;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;

OPEN resultset;

SET @query = "SELECT * FROM notificaciones n WHERE n.id IN('null'";

the_loop: LOOP
    FETCH resultset INTO idNotificacion;
    IF done THEN
        LEAVE the_loop;
    END IF;
    SET cont = cont + 1;
    SET flag = TRUE;
    SET @query = CONCAT(@query," , " ,idNotificacion);
    UPDATE notificaciones SET active=0 WHERE id=idNotificacion;
END LOOP the_loop;

CLOSE resultset;

IF flag THEN
    SET @query = CONCAT(@query, ")");
    PREPARE stmt FROM @query;
    EXECUTE stmt;
    DEALLOCATE PREPARE stmt;
END IF;

END

1 个答案:

答案 0 :(得分:0)

你真的需要一个游标吗?像这样的选项,可能有用:

/* Procedure structure for procedure `prueba` */

/*!50003 DROP PROCEDURE IF EXISTS  `prueba` */;

DELIMITER $$

CREATE PROCEDURE `prueba`(`idusuario` INT)
BEGIN
    DECLARE `ids` LONGTEXT DEFAULT NULL;
    SELECT GROUP_CONCAT(`id`) INTO `ids`
    FROM `notificaciones`
    WHERE `involveda_idusuario` = `idusuario` AND `active` = 1;
    IF (`ids` IS NOT NULL) THEN
        SET @`stmt` := CONCAT('UPDATE `notificaciones`
                SET `active` = 0
                WHERE `id` IN (', `ids`, ')');
        PREPARE `exec`  FROM @`stmt`;
        EXECUTE `exec`;
        SET @`stmt` := CONCAT('SELECT `id`, `involveda_idusuario`, `active`
                FROM `notificaciones` `n`
                WHERE `n`.`id` IS NULL OR `n`.`id` IN (', `ids`, ')');
        PREPARE `exec`  FROM @`stmt`;
        EXECUTE `exec`;
        DEALLOCATE PREPARE `exec`;
    END IF;
END$$

DELIMITER ;

您必须小心使用GROUP_CONCAT和系统变量group_concat_max_len

SQL Fiddle demo