在学习MySqL的存储过程,如下语句:create procedure sp_name()
begin
end可以正常建立但是我在begin和end之间写上任务代码时,就提示出错了,为什么呢?(先删除掉前一个建立的存储过程的,插入的语句,单独都能正常运行)create procedure sp_name()
begin
insert into test values(3,3)
end
应该怎么写呢?我看网上的教程就这么写的,直接复制下来也出错

解决方案 »

  1.   

    你是在MYSQL SHELL下?
    mysql>DELIMITER $$
    mysql>CREATE PROCEDURE `aa` ()
    -BEGIN
    -  SELECT * FROM T4;
    -END
    -$$
    mysql>DELIMITER ; 
      

  2.   

    谢谢我用的是SQLyog,也试了MySQL Front,shell用起来不大方便就没用了用SQL yog里面自动产生的语句,也是错误的DELIMITER $$CREATE
        PROCEDURE `study`.`sp_test`()
        BEGIN
            SELECT * FROM test
        END$$DELIMITER ;看了一下,和你的也是一样的,为什么还是错误的呢?
      

  3.   

    mySQL默认分号为语句结束符,所有在编写 procedure , function ,trigger 的时候,需要用delimiter 来重定义提交符。
      

  4.   

    mysql> DELIMITER $$
    mysql> CREATE PROCEDURE QQ()
        -> BEGIN
        ->  SELECT * FROM test;
        -> END
        -> $$
    Query OK, 0 rows affected (0.00 sec)
      

  5.   

    你可以参考一下官方文档
    http://dev.mysql.com/doc/refman/5.1/zh/stored-procedures.html#create-procedure20.2.1. CREATE PROCEDURE和CREATE FUNCTION下面是一个使用OUT参数的简单的存储程序的例子。例子为,在程序被定义的时候,用mysql客户端delimiter命令来把语句定界符从 ;变为//。这就允许用在程序体中的;定界符被传递到服务器而不是被mysql自己来解释。mysql> delimiter //
     
    mysql> CREATE PROCEDURE simpleproc (OUT param1 INT)
        -> BEGIN
        ->   SELECT COUNT(*) INTO param1 FROM t;
        -> END
        -> //
    Query OK, 0 rows affected (0.00 sec)
     
    mysql> delimiter ;
     
    mysql> CALL simpleproc(@a);
    Query OK, 0 rows affected (0.00 sec)
     
    mysql> SELECT @a;
    +------+
    | @a   |
    +------+
    | 3    |
    +------+
    1 row in set (0.00 sec)
    当使用delimiter命令时,你应该避免使用反斜杠(‘\’)字符,因为那是MySQL的转义字符。 
      

  6.   

    大概错误知道了,谢谢,不过还是有点不明白DELIMITER $$CREATE
        PROCEDURE `study`.`sp_doit`()
        BEGIN
            INSERT INTO test VALUES(6,66);#原来的没加分号,加上就可以了
        END
    $$DELIMITER ;
    不过我是想建立一个插入100000条数据的存储过程,发现又不行了……DELIMITER $$CREATE
        PROCEDURE `study`.`sp_doit`()
        BEGIN
            DECLARE i;
            SET i=1;
            WHILE i<100000 DO
                INSERT INTO test VALUES(6,66);
                SET i=i+1;
            END WHILE;
        END
    $$DELIMITER ;
      

  7.   

    DELIMITER $$
    drop procedure if exists rr1$$
    CREATE PROCEDURE `test`.`rr1`()
    begin
         DECLARE i int;
            SET i=1;
            WHILE i<100000 DO
                INSERT INTO test VALUES(6,66);
                SET i=i+1;
            END WHILE;
        END$$DELIMITER ;
      

  8.   

    DELIMITER $$CREATE
        PROCEDURE `sp_doit`()
        BEGIN
            DECLARE i INT; --Changed by ACMAIN
            SET i=1;
            WHILE i<100000 DO
                INSERT INTO test VALUES(6,66);
                SET i=i+1;
            END WHILE;
        END
    $$DELIMITER ;mysql> CREATE
        ->     PROCEDURE `sp_doit`()
        ->     BEGIN
        ->         DECLARE i INT;
        ->         SET i=1;
        ->         WHILE i<100000 DO
        ->             INSERT INTO test VALUES(6,66);
        ->             SET i=i+1;
        ->         END WHILE;
        ->     END
        -> $$
    Query OK, 0 rows affected (0.00 sec)
      

  9.   

    http://dev.mysql.com/doc/refman/5.1/zh/stored-procedures.html#while-statement20.2.12.7. WHILE语句中有这个例子。