存储:
DELIMITER $$USE `osdktest2`$$DROP PROCEDURE IF EXISTS `jj`$$CREATE DEFINER=`root`@`localhost` PROCEDURE `jj`()
BEGIN
     DECLARE v_interval INT UNSIGNED;
     DECLARE v_timeslot INT UNSIGNED;
     DECLARE v_pid INT UNSIGNED;
     
     DECLARE cur_date CURSOR FOR 
     SELECT pid,TIMESTAMPDIFF(MINUTE,DATE_FORMAT(login_time,'%Y-%m-%d %H:%i'),DATE_FORMAT(logout_time,'%Y-%m-%d %H:%i')) AS interval_time
     FROM test;
   --  DECLARE CONTINUE HANDLER FOR NOT FOUND 
     
     SET v_timeslot = 0 ;
   
     OPEN cur_date;
     FETCH CURSOR INTO v_pid,v_interval;
     WHILE v_timeslot <= v_interval DO
     REPLACE INTO test1 (pid,interval_time) VALUES (v_pid,v_interval);
     SET v_timeslot = v_timeslot + 1;
     FETCH CURSOR INTO v_pid,v_interval;
     END WHILE;
     CLOSE cur_date;
  --   select * from test1;
END$$DELIMITER ;报错:
Query : CREATE DEFINER=`root`@`localhost` PROCEDURE `jj`() BEGIN      DECLARE v_interval INT UNSIGNED;      declare v_timeslot int UNSIG...
Error Code : 1064
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'CURSOR INTO v_pid,v_interval;
     while v_timeslot <= v_interval do
     replac' at line 15
Execution Time : 00:00:00:000
Transfer Time  : 00:00:00:000
Total Time     : 00:00:00:000请指教是哪里出问题了,总是不能编译通过。

解决方案 »

  1.   

    FETCH cur_date INTO v_pid,v_interval;
      

  2.   

    修改为这样,还是报错:
    DELIMITER $$USE `osdktest2`$$DROP PROCEDURE IF EXISTS `jj`$$CREATE DEFINER=`root`@`localhost` PROCEDURE `jj`()
    BEGIN
         DECLARE v_interval INT UNSIGNED;
         DECLARE v_timeslot INT UNSIGNED;
         DECLARE v_pid INT UNSIGNED;
         
         DECLARE cur_date CURSOR FOR 
         SELECT pid,TIMESTAMPDIFF(MINUTE,DATE_FORMAT(login_time,'%Y-%m-%d %H:%i'),DATE_FORMAT(logout_time,'%Y-%m-%d %H:%i')) AS interval_time
         FROM test;
       --  DECLARE CONTINUE HANDLER FOR NOT FOUND 
         
         SET v_timeslot = 0 ;
       
         OPEN cur_date;
         FETCH cur_date INTO v_pid,v_interval;
         
         WHILE v_timeslot <= v_interval DO
           REPLACE INTO test1 (pid,interval_time) VALUES (v_pid,v_interval);
           SET v_timeslot = v_timeslot + 1;
           FETCH CURSOR INTO v_pid,v_interval;
         END WHILE;
         CLOSE cur_date;
         DEALLOCATE cur_date;
      --   select * from test1;
    END$$DELIMITER ;
    错误信息:
    Error Code : 1064
    You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'cursor into v_pid,v_interval;
         end while;
         close cur_date;
         DEALLOCA' at line 20
    Execution Time : 00:00:00:000
    Transfer Time  : 00:00:00:000
    Total Time     : 00:00:00:000
    请指教。
      

  3.   

    不好意思,中间的fatch那里写错了,但是执行这个存储的时候出现以下错误,
    Warning Code : 1264
    Out of range value for column 'interval_time' at row 97837
    Warning Code : 1264
    Out of range value for column 'interval_time' at row 97838
    请问是哪里的逻辑错误了
      

  4.   

    简单示例:
    CREATE PROCEDURE curdemo(IN V_GROUP INT)
        -> BEGIN
        ->   DECLARE done INT DEFAULT 0;
        ->   DECLARE a INT;
        ->   DECLARE b CHAR(16);
        ->
        ->   DECLARE cur1 CURSOR FOR SELECT id,name FROM student where classid=V_GROUP;
        ->   DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;
        ->
        ->   OPEN cur1;
        ->
        ->   REPEAT
        ->     FETCH cur1 INTO a, b;
        ->     select a,b;
        ->   UNTIL done END REPEAT;
        ->
        ->   CLOSE cur1;
        -> END
      

  5.   

    FETCH CURSOR INTO v_pid,v_interval;改成FETCH cur_date INTO v_pid,v_interval;