存储过程插入最后两次记录,循环问题?

时间:2014-03-27 10:27:31

标签: mysql sql stored-procedures

-- --------------------------------------------------------------------------------
-- Author: Stevie G
-- --------------------------------------------------------------------------------
DELIMITER $$

CREATE DEFINER=`root`@`localhost` PROCEDURE `test`()
    DETERMINISTIC
    COMMENT 'Test'
BEGIN  
    DECLARE done BOOLEAN DEFAULT 0;
    DECLARE Ttp INT;
    DECLARE Ttpname TEXT;

    DECLARE tmp CURSOR FOR 
                       SELECT tp_id, tp_name FROM tp;

    DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done=1;

    OPEN tmp;

    REPEAT FETCH tmp INTO Ttp, Ttpname;

    #INITIALISE ALL INSERT VALUES TO 0 FIRST
    SET @tp = 0;
    SET @tpname = '';

    SET @tp = Ttp;
    SET @tpname = Ttpname;

    #insert into entities
    INSERT INTO entity (name) VALUES (Ttpname);

    UNTIL done END REPEAT;
    CLOSE tmp; 
END

最后一条记录是重复记录,在我运行程序时插入两次。必须是循环和条件的问题。

1 个答案:

答案 0 :(得分:2)

更改

REPEAT 
    FETCH tmp INTO Ttp, Ttpname;

    #INITIALISE ALL INSERT VALUES TO 0 FIRST
    SET @tp = 0;
    SET @tpname = '';

    SET @tp = Ttp;
    SET @tpname = Ttpname;

    #insert into entities
    INSERT INTO entity (name) VALUES (Ttpname);

UNTIL done END REPEAT;

REPEAT 
    FETCH tmp INTO Ttp, Ttpname;

    IF ( ! done ) THEN
        -- INITIALISE ALL INSERT VALUES TO 0 FIRST
        SET @tp = 0;
        SET @tpname = '';

        SET @tp = Ttp;
        SET @tpname = Ttpname;

        -- insert into entities
        INSERT INTO entity (name) VALUES (Ttpname);
    END IF;
UNTIL done END REPEAT;

FETCH tmp INTO Ttp, Ttpname;
REPEAT 
    #INITIALISE ALL INSERT VALUES TO 0 FIRST
    SET @tp = 0;
    SET @tpname = '';

    SET @tp = Ttp;
    SET @tpname = Ttpname;

    #insert into entities
    INSERT INTO entity (name) VALUES (Ttpname);

    FETCH tmp INTO Ttp, Ttpname;
UNTIL done END REPEAT;

这是因为:

  

如果FETCH超过结果集中的最后一行,则目标字段或变量的值不确定,NOTFOUND属性返回TRUE

请参阅 :(这是在Oracle游标上,但也适用于其他游标):