结贴结快了。发现还是有问题[SQL] create procedure x()
begin
 DECLARE done INT DEFAULT 0;
 DECLARE a,b INT;
 DECLARE c varchar(10);
 DECLARE cur1 CURSOR FOR SELECT pid FROM pra_forum_post order by pid limit 24000;
 DECLARE cur2 CURSOR FOR SELECT pid,subject FROM pra_forum_post order by pid limit 24000,24000;
 DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1; OPEN cur1;
 OPEN cur2; FETCH cur1 INTO a;
 FETCH cur2 INTO b, c; WHILE done = 0 DO
         update post set subject=c where pid=a;         FETCH cur1 INTO a;
         FETCH cur2 INTO b, c;
  END WHILE;
 CLOSE cur1;
 CLOSE cur2;end;
delimiter ;
call x();[Err] 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 'x()
begin
 DECLARE done INT DEFAULT 0;
 DECLARE a,b INT;
 DECLARE c varchar(' at line 1

解决方案 »

  1.   

    DELIMITER $$
    CREATE PROCEDURE X()
    BEGIN
     DECLARE done INT DEFAULT 0;
     DECLARE a INT;
     DECLARE b INT;
     DECLARE c VARCHAR(10);
     DECLARE cur1 CURSOR FOR SELECT pid FROM pra_forum_post ORDER BY pid LIMIT 24000;
     DECLARE cur2 CURSOR FOR SELECT pid,SUBJECT FROM pra_forum_post ORDER BY pid LIMIT 24000,24000;
     DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;
     OPEN cur1;
     OPEN cur2;
     FETCH cur1 INTO a;
     FETCH cur2 INTO b,c;
     WHILE done = 0 DO
      UPDATE post SET `subject`=c WHERE pid=a;
      FETCH cur1 INTO a;
     FETCH cur2 INTO b,c;
      END WHILE;
     CLOSE cur1;
     CLOSE cur2;
    END;$$
    DELIMITER ;
      

  2.   

    放到GUI客户端执行没问题啊。如果到命令行下,先要用DELIMITER // 修改提交符,然后在最后的NED;后面加上 //提交。这样才行。
      

  3.   

    or
    DELIMITER $$
    CREATE PROCEDURE X()
    BEGIN
     DECLARE done INT DEFAULT 0;
     DECLARE a,b INT;
     DECLARE c VARCHAR(10);
     DECLARE cur1 CURSOR FOR SELECT pid FROM pra_forum_post ORDER BY pid LIMIT 24000;
     DECLARE cur2 CURSOR FOR SELECT pid,SUBJECT FROM pra_forum_post ORDER BY pid LIMIT 24000,24000;
     DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;
     OPEN cur1;
     OPEN cur2;
     FETCH cur1 INTO a;
     FETCH cur2 INTO b,c;
     WHILE done = 0 DO
      UPDATE post SET `subject`=c WHERE pid=a;
      FETCH cur1 INTO a;
     FETCH cur2 INTO b,c;
      END WHILE;
     CLOSE cur1;
     CLOSE cur2;
    END;$$
    DELIMITER ;
      

  4.   

    没有任何问题啊。 其实在发给之前就已经测试过了。 你是不是没有加 delimiter //Query OK, 0 rows affected (0.02 sec)mysql> create procedure x()
        -> begin
        ->   DECLARE done INT DEFAULT 0;
        ->   DECLARE a,b INT;
        ->   DECLARE c varchar(10);
        ->   DECLARE cur1 CURSOR FOR SELECT pid FROM pra_forum_post order by pid lim
    it 24000;
        ->   DECLARE cur2 CURSOR FOR SELECT pid,subject FROM pra_forum_post order by
     pid limit 24000,24000;
        ->   DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;
        ->
        ->   OPEN cur1;
        ->   OPEN cur2;
        ->
        ->   FETCH cur1 INTO a;
        ->   FETCH cur2 INTO b, c;
        ->
        ->   WHILE done = 0 DO
        ->         update post set subject=c where pid=a;
        ->
        ->         FETCH cur1 INTO a;
        ->         FETCH cur2 INTO b, c;
        ->  END WHILE;
        ->   CLOSE cur1;
        ->   CLOSE cur2;
        ->
        -> end;
        -> //
    Query OK, 0 rows affected (0.00 sec)mysql> delimiter ;
    mysql>
      

  5.   

    mysql> create procedure x()
        -> begin
        -> DECLARE done INT DEFAULT 0;
        -> DECLARE a,b INT;
        -> DECLARE c varchar(10);
        -> DECLARE cur1 CURSOR FOR SELECT pid FROM pra_forum_post order by pid lim
    it 24000;
        ->  DECLARE cur2 CURSOR FOR SELECT pid,subject FROM pra_forum_post order by
     pid limit 24000,24000;
        ->  DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;
        -> 
        ->  OPEN cur1;
        ->  OPEN cur2;
        -> 
        ->  FETCH cur1 INTO a;
        ->  FETCH cur2 INTO b, c;
        -> WHILE done = 0 DO
        -> update post set subject=c where pid=a;
        ->   FETCH cur1 INTO a;
        ->   FETCH cur2 INTO b, c;
        ->  END WHILE;
        ->  CLOSE cur1;
        ->  CLOSE cur2;
        -> 
        ->  end;
    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 'x()beginDECLARE done INT DEFAULT 0;DECLARE a,b INT;DECLARE c' at line 1
    mysql> 
      

  6.   

    为啥我这个就是通过不了呢?奇怪了。我的Mysql版本为5.0.
      

  7.   


    mysql> DELIMITER $$
    mysql> CREATE PROCEDURE X()
        -> BEGIN
        -> DECLARE done INT DEFAULT 0;
        -> DECLARE a INT;
        ->  DECLARE b INT;
        ->  DECLARE c VARCHAR(10);
        ->  DECLARE cur1 CURSOR FOR SELECT pid FROM pra_forum_post ORDER BY pid LIMIT 24000;
        ->  DECLARE cur2 CURSOR FOR SELECT pid,SUBJECT FROM pra_forum_post ORDER BY pid LIMIT 24000,24000;
        ->  DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;
        ->  OPEN cur1;
        ->  OPEN cur2;
        ->  FETCH cur1 INTO a;
        -> FETCH cur2 INTO b,c;
        ->  WHILE done = 0 DO
        ->  UPDATE post SET `subject`=c WHERE pid=a;
        ->  FETCH cur1 INTO a;
        ->  FETCH cur2 INTO b,c;
        ->   END WHILE;
        ->  CLOSE cur1;
        ->  CLOSE cur2;
        -> END;$$
    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 'X()BEGINDECLARE done INT DEFAULT 0;DECLARE a INT; DECLARE b ' at line 1
    mysql> 
      

  8.   

    5.0也是支持存储过程的。如下贴出你的版本。mysql> select version();
    +------------------+
    | version()        |
    +------------------+
    | 5.1.47-community |
    +------------------+
    1 row in set (0.00 sec)mysql>另外再试下
    create procedure x1()
    select 1;
    mysql> create procedure x1()
        -> select 1;
    Query OK, 0 rows affected (0.00 sec)mysql> call x1();
    +---+
    | 1 |
    +---+
    | 1 |
    +---+
    1 row in set (0.00 sec)Query OK, 0 rows affected (0.00 sec)mysql>
      

  9.   

    mysql> select version();
    +------------+
    | version()  |
    +------------+
    | 5.0.91-log |
    +------------+
    1 row in setmysql> create procedure x1()
    select 1;
    Query OK, 0 rows affectedmysql> call x1();
    +---+
    | 1 |
    +---+
    | 1 |
    +---+
    1 row in setQuery OK, 0 rows affectedmysql> 
      

  10.   

    至少现在你不用怀疑你的MYSQL不支持存储过程了。原样贴出你有问题的那段SQL语句。一个字都不变。然后再象楼上一样,在MYSQL中执行,连错误信息一起贴出来。估计你的语句中是不是有什么看不见的特殊字符。
      

  11.   

    mysql> DELIMITER $$;
    mysql> CREATE PROCEDURE X()
        -> BEGIN
        -> DECLARE done INT DEFAULT 0;
        -> DECLARE a INT;
        -> DECLARE b INT;
        -> DECLARE c VARCHAR(10);
        -> DECLARE cur1 CURSOR FOR SELECT pid FROM pra_forum_post ORDER BY pid LIMIT 24000;
        -> DECLARE cur2 CURSOR FOR SELECT pid,SUBJECT FROM pra_forum_post ORDER BY pid LIMIT 24000,24000;
        -> DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;
        -> OPEN cur1;
        -> OPEN cur2;
        -> FETCH cur1 INTO a;
        -> FETCH cur2 INTO b,c;
        -> WHILE done = 0 DO
        -> UPDATE post SET `subject`=c WHERE pid=a;
        -> FETCH cur1 INTO a;
        -> FETCH cur2 INTO b,c;
        -> END WHILE;
        -> CLOSE cur1;
        -> CLOSE cur2;
        -> END;$$
        -> DELIMITER ;
        -> call X();
        -> 这次居然什么反应都没有?
      

  12.   

    mysql> DELIMITER $$;改成mysql> DELIMITER $$
      

  13.   

    mysql> DELIMITER $$
    mysql> CREATE PROCEDURE X()
        -> BEGIN
        -> DECLARE done INT DEFAULT 0;
        -> DECLARE a INT;
        -> DECLARE b INT;
        -> DECLARE c VARCHAR(80);
        -> DECLARE cur1 CURSOR FOR SELECT pid FROM pra_forum_post ORDER BY pid LIMIT 24000;
        -> DECLARE cur2 CURSOR FOR SELECT pid,SUBJECT FROM pra_forum_post ORDER BY pid LIMIT 24000,24000;
        -> DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;
        -> OPEN cur1;
        -> OPEN cur2;
        -> FETCH cur1 INTO a;
        -> FETCH cur2 INTO b,c;
        -> WHILE done = 0 DO
        -> UPDATE post SET `subject`=c WHERE pid=a;
        -> FETCH cur1 INTO a;
        -> FETCH cur2 INTO b,c;
        -> END WHILE;
        -> CLOSE cur1;
        -> CLOSE cur2;
        -> END;$$
    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 'X()BEGINDECLARE done INT DEFAULT 0;DECLARE a INT;DECLARE b I' at line 1
    mysql> 
      

  14.   

    你现在一个字都不要改,直接贴到你的MYSQL中执行。DELIMITER $$
    drop PROCEDURE X$$
    CREATE PROCEDURE X()
    BEGIN
    DECLARE done INT DEFAULT 0;
    DECLARE a INT;
    DECLARE b INT;
    DECLARE c VARCHAR(80);
    DECLARE cur1 CURSOR FOR SELECT pid FROM pra_forum_post ORDER BY pid LIMIT 24000;
    DECLARE cur2 CURSOR FOR SELECT pid,SUBJECT FROM pra_forum_post ORDER BY pid LIMIT 24000,24000;
    DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;
    OPEN cur1;
    OPEN cur2;
    FETCH cur1 INTO a;
    FETCH cur2 INTO b,c;
    WHILE done = 0 DO
    UPDATE post SET `subject`=c WHERE pid=a;
    FETCH cur1 INTO a;
    FETCH cur2 INTO b,c;
    END WHILE;
    CLOSE cur1;
    CLOSE cur2;
    END;$$
      

  15.   

    哈哈哈哈,改成这个可以,发现用大写的X不能做函数名称。DELIMITER $$
    CREATE PROCEDURE xxx()
    BEGIN
    DECLARE done INT DEFAULT 0;
    DECLARE a INT;
    DECLARE b INT;
    DECLARE c VARCHAR(80);
    DECLARE cur1 CURSOR FOR SELECT pid FROM pra_forum_post ORDER BY pid LIMIT 24000;
    DECLARE cur2 CURSOR FOR SELECT pid,SUBJECT FROM pra_forum_post ORDER BY pid LIMIT 24000,24000;
    DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;
    OPEN cur1;
    OPEN cur2;
    FETCH cur1 INTO a;
    FETCH cur2 INTO b,c;
    WHILE done = 0 DO
    UPDATE pra_forum_post SET `subject`=c WHERE pid=a;
    FETCH cur1 INTO a;
    FETCH cur2 INTO b,c;
    END WHILE;
    CLOSE cur1;
    CLOSE cur2;
    END;$$
    DELIMITER ;