实际使用很奇怪发生问题 , SELECT id FROM P  的最后一个id总是在
select ul.Id number, 4 as date from u ul where  ul.lastaccess>DATE_SUB(CURDATE(),INTERVAL DAY(CURDATE())-1 DAY)   and ul.lastaccess<curdate()   and ul.pd=aid group by ul.uId;
执行2次 ,不知道什么原因 ?  从1------max(id)-1 都正常只有一次
什么原因 ?  如何解决?CREATE PROCEDURE `sp_Session`()
beginDECLARE no_more_gbmes int;declare aid int;declare  auserLogId int;  declare aTime datetime;  declare aminid int;  declare num int;declare  gbmes_csr CURSOR FOR SELECT id FROM P;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET no_more_gbmes=1;SET no_more_gbmes=0;  OPEN gbmes_csr;    REPEAT    fetch  gbmes_csr INTO aid;   
    insert into u select ul.Id number, 4 as date from u ul where  ul.lastaccess>DATE_SUB(CURDATE(),INTERVAL DAY(CURDATE())-1 DAY)   and ul.lastaccess<curdate()   and ul.pd=aid group by ul.uId;    until  no_more_gbmes    END REPEAT;    CLOSE gbmes_csr;end;

解决方案 »

  1.   

    REPEAT就是这样,你需要换成while
      

  2.   

    “REPEAT就是这样,你需要换成while”--------这个如何换 啦 ??? 我找找手册上的例子 
      

  3.   

    感谢楼上2位  在手册找到解决问题 
    CREATE PROCEDURE curdemo()BEGIN  DECLARE done INT DEFAULT 0;  DECLARE a CHAR(16);  DECLARE b,c INT;  DECLARE cur1 CURSOR FOR SELECT id,data FROM test.t1;  DECLARE cur2 CURSOR FOR SELECT i FROM test.t2;  DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done = 1;   OPEN cur1;  OPEN cur2;   REPEAT    FETCH cur1 INTO a, b;    FETCH cur2 INTO c;    IF NOT done THEN       IF b < c THEN          INSERT INTO test.t3 VALUES (a,b);       ELSE          INSERT INTO test.t3 VALUES (a,c);       END IF;    END IF;  UNTIL done END REPEAT;   CLOSE cur1;  CLOSE cur2;END20.2.11. 光标20.2.11.1.声明光标20.2.11.2. 光标OPEN语句20.2.11.3. 光标FETCH语句20.2.11.4. 光标CLOSE语句简单光标在存储程序和函数内被支持。语法如同在嵌入的SQL中。光标当前是不敏感的,只读的及不滚动的。不敏感意为服务器可以活不可以复制它的结果表。光标必须在声明处理程序之前被声明,并且变量和条件必须在声明光标或处理程序之前被声明。例如:CREATE PROCEDURE curdemo()BEGIN  DECLARE done INT DEFAULT 0;  DECLARE a CHAR(16);  DECLARE b,c INT;  DECLARE cur1 CURSOR FOR SELECT id,data FROM test.t1;  DECLARE cur2 CURSOR FOR SELECT i FROM test.t2;  DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done = 1;   OPEN cur1;  OPEN cur2;   REPEAT    FETCH cur1 INTO a, b;    FETCH cur2 INTO c;    IF NOT done THEN       IF b < c THEN          INSERT INTO test.t3 VALUES (a,b);       ELSE          INSERT INTO test.t3 VALUES (a,c);       END IF;    END IF;  UNTIL done END REPEAT;   CLOSE cur1;  CLOSE cur2;END20.2.11.1.声明光标DECLARE cursor_name CURSOR FOR select_statement这个语句声明一个光标。也可以在子程序中定义多个光标,但是一个块中的每一个光标必须有唯一的名字。SELECT语句不能有INTO子句。
    20.2.11.2. 光标OPEN语句OPEN cursor_name这个语句打开先前声明的光标。
    20.2.11.3. 光标FETCH语句FETCH cursor_name INTO var_name [, var_name] ...这个语句用指定的打开光标读取下一行(如果有下一行的话),并且前进光标指针。
    20.2.11.4. 光标CLOSE语句CLOSE cursor_name这个语句关闭先前打开的光标。如果未被明确地关闭,光标在它被声明的复合语句的末尾被关闭。
    20.2.12. 流程控制构造20.2.12.1. IF语句20.2.12.2. CASE语句20.2.12.3. LOOP语句20.2.12.4. LEAVE语句20.2.12.5. ITERATE语句20.2.12.6. REPEAT语句20.2.12.7. WHILE语句IF, CASE, LOOP, WHILE, ITERATE, 及 LEAVE 构造被完全实现。这些构造可能每个包含要么一个单独语句,要么是使用BEGIN ... END复合语句的一块语句。构造可以被嵌套。目前还不支持FOR循环。
    20.2.12.1. IF语句IF search_condition THEN statement_list    [ELSEIF search_condition THEN statement_list] ...    [ELSE statement_list]END IFIF实现了一个基本的条件构造。如果search_condition求值为真,相应的SQL语句列表被执行。如果没有search_condition匹配,在ELSE子句里的语句列表被执行。statement_list可以包括一个或多个语句。请注意,也有一个IF() 函数,它不同于这里描述的IF语句。请参阅12.2节,“控制流程函数”。
    20.2.12.2. CASE语句CASE case_value    WHEN when_value THEN statement_list    [WHEN when_value THEN statement_list] ...    [ELSE statement_list]END CASEOr:CASE    WHEN search_condition THEN statement_list    [WHEN search_condition THEN statement_list] ...    [ELSE statement_list]END CASE存储程序的CASE语句实现一个复杂的条件构造。如果search_condition 求值为真,相应的SQL被执行。如果没有搜索条件匹配,在ELSE子句里的语句被执行。注意:这里介绍的用在存储程序里的CASE语句与12.2节,“控制流程函数”里描述的SQL CASE表达式的CASE语句有轻微不同。这里的CASE语句不能有ELSE NULL子句,并且用END CASE替代END来终止。
    20.2.12.3. LOOP语句[begin_label:] LOOP    statement_listEND LOOP [end_label]LOOP允许某特定语句或语句群的重复执行,实现一个简单的循环构造。在循环内的语句一直重复直循环被退出,退出通常伴随着一个LEAVE 语句。LOOP语句可以被标注。除非begin_label存在,否则end_label不能被给出,并且如果两者都出现,它们必须是同样的。
    20.2.12.4. LEAVE语句LEAVE label这个语句被用来退出任何被标注的流程控制构造。它和BEGIN ... END或循环一起被使用。
    20.2.12.5. ITERATE语句ITERATE labelITERATE只可以出现在LOOP, REPEAT, 和WHILE语句内。ITERATE意思为:“再次循环。”例如:CREATE PROCEDURE doiterate(p1 INT)BEGIN  label1: LOOP    SET p1 = p1 + 1;    IF p1 < 10 THEN ITERATE label1; END IF;    LEAVE label1;  END LOOP label1;  SET @x = p1;END20.2.12.6. REPEAT语句[begin_label:] REPEAT    statement_listUNTIL search_conditionEND REPEAT [end_label]REPEAT语句内的语句或语句群被重复,直至search_condition 为真。REPEAT 语句可以被标注。 除非begin_label也存在,end_label才能被用,如果两者都存在,它们必须是一样的。例如:mysql> delimiter // mysql> CREATE PROCEDURE dorepeat(p1 INT)    -> BEGIN    ->   SET @x = 0;    ->   REPEAT SET @x = @x + 1; UNTIL @x > p1 END REPEAT;    -> END    -> //Query OK, 0 rows affected (0.00 sec) mysql> CALL dorepeat(1000)//Query OK, 0 rows affected (0.00 sec) mysql> SELECT @x//+------+| @x   |+------+| 1001 |+------+1 row in set (0.00 sec)20.2.12.7. WHILE语句[begin_label:] WHILE search_condition DO    statement_listEND WHILE [end_label]WHILE语句内的语句或语句群被重复,直至search_condition 为真。WHILE语句可以被标注。 除非begin_label也存在,end_label才能被用,如果两者都存在,它们必须是一样的。例如:CREATE PROCEDURE dowhile()BEGIN  DECLARE v1 INT DEFAULT 5;   WHILE v1 > 0 DO    ...    SET v1 = v1 - 1;  END WHILE;END
    http://dev.mysql.com/doc/refman/5.1/zh/stored-procedures.html#cursors
      

  4.   


    CREATE PROCEDURE `sp_Session`()
    beginDECLARE no_more_gbmes int;declare aid int;declare auserLogId int;  declare aTime datetime;  declare aminid int;  declare num int;declare gbmes_csr CURSOR FOR SELECT id FROM P;
    DECLARE CONTINUE HANDLER FOR NOT FOUND SET no_more_gbmes=1;SET no_more_gbmes=0;  OPEN gbmes_csr;  REPEAT  fetch gbmes_csr INTO aid;  IF NOT no_more_gbmes THEN
      insert into u select ul.Id number, 4 as date from u ul where ul.lastaccess>DATE_SUB(CURDATE(),INTERVAL DAY(CURDATE())-1 DAY) and ul.lastaccess<curdate() and ul.pd=aid group by ul.uId;
    end if
      until no_more_gbmes  END REPEAT;  CLOSE gbmes_csr;end;