带循环的基本游标mysql

时间:2018-02-15 05:15:27

标签: mysql

我一直在尝试创建一个游标,但由于某种原因,我不断收到一个错误,说法语有问题。

我要求的是一个基本游标,我可以使用循环,以便我可以为每一行调用一个函数。字面上是一个mysql equivelent的php foreach循环

    function functionName ($commentId){
    $i = 0; 
    foreach (commentId as value) {
    //inside here we would do whatever function we would like but for this example i just want a basic increment to keep things simple and easy to understand
    $i++;
    } 
    echo $i;} 
    functionName(76);

我理解php有点不同,因为我首先需要使用mysql查询选择行并让$ commentId变量等于但我只是以此为例让这个问题像我一样清晰可以做到。

这是我不断失败的例子

    DELIMITER $$

    create function functionName(commentOn int(11)) returns int

    BEGIN
    DECLARE done INT DEFAULT FALSE;
    declare var int;
    declare anotherVar int;
    set var = 0;
    set anotherVar = 0;

      DECLARE cur1 CURSOR FOR SELECT id FROM comments where `commentOnComment` = commentOn;
      DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;

      OPEN cur1;

      read_loop: LOOP
        FETCH cur1 INTO anotherVar;

        set var = var + 1;

    IF done THEN
          LEAVE read_loop;
        END IF;
      END LOOP;

      CLOSE cur1;

      return var;
    END; $$

    DELIMITER ;

    select functionName(76);

更详细地解释这个示例的内容,有一个表格comments,评论id和用户评论的评论的ID(commentOnComment )。最后我想循环遍历所有评论并选择所有commentOnComment等于用户评论的评论的id,以便我可以看到每个评论有多少回复我将将增量更改为select count(*) from comments where commentOnComment = commentOn;,commentOn参数将是注释的ID。 但是对于这个问题所显示的答案,我只想增加一点,让自己和其他人理解简单易行。

1 个答案:

答案 0 :(得分:0)

感谢P.Salmon我能够获得一个循环工作的基本游标,这只是我的代码的顺序是问题。作为一个像我这样的小错误,我非常感谢我将永远弄明白我以前从未做过工作光标的事实。

这是基本游标的代码,它为表中的每一行执行一个函数,在这个例子中,它将变量的值递增1。

    DELIMITER $$

        create function functionName(commentOn int(11)) returns int

        BEGIN
        DECLARE done INT DEFAULT FALSE;
        declare var int;
        declare anotherVar int;
        DECLARE cur1 CURSOR FOR SELECT id FROM comments where `commentOnComment` = commentOn;
          DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;
        set var = 0;
        set anotherVar = 0;



          OPEN cur1;

          read_loop: LOOP
            FETCH cur1 INTO anotherVar;

        IF done THEN
              LEAVE read_loop;
            END IF;
    /*comment here is the area where you can add whatever insert, update, select or any 
      type of function you would like for each row. This is literally mysql's version of 
      php's foreach loop*/
            set var = var + 1;
          END LOOP;

          CLOSE cur1;

          return var;
        END; $$

        DELIMITER ;

你可以看到它与我刚才需要改变代码顺序的问题非常相似。一个简单的select functionName(id);会给你输出,id可以是任意数字,在这个例子中它将是行的id。

我也很好奇为什么很多人看过这个问题却没有回答,因此导致我必须自己回答?如果P.Salmon没有评论并告诉我问题我仍会被卡住。我试图尽可能清楚,难以理解吗?这个问题对大多数人来说太难了吗?反馈将受到高度赞赏,因为它将帮助我解决未来的问题。