美文网首页
Mysql 定义存储程序

Mysql 定义存储程序

作者: __笙歌4J | 来源:发表于2019-07-18 10:09 被阅读0次

    每个存储的程序都包含一个由SQL语句组成的主体。该语句可以是由分号(;)字符分隔的多个语句组成的复合语句。例如,下面的存储过程有一个包含SET语句的BEGIN ... END块和包含另一个SET语句的REPEAT循环:

    CREATE PROCEDURE dorepeat(p1 INT)
    BEGIN
      SET @x = 0;
      REPEAT SET @x = @x + 1; UNTIL @x > p1 END REPEAT;
    END;
    

    如果使用mysql客户机程序定义包含分号字符的存储程序,就会出现问题。默认情况下,mysql本身将分号识别为语句分隔符,因此必须临时重新定义分隔符,以便mysql将整个存储的程序定义传递给服务器。

    若要重新定义mysql分隔符,请使用delimiter命令。下面的示例显示了如何对刚才显示的dorepeat()过程执行此操作。将分隔符更改为//,以使整个定义作为一条语句传递给服务器,然后还原为;在调用过程之前。这使得;在要传递给服务器的过程主体中使用的分隔符,而不是由mysql本身解释的分隔符。

    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> delimiter ;
    
    mysql> CALL dorepeat(1000);
    Query OK, 0 rows affected (0.00 sec)
    
    mysql> SELECT @x;
    +------+
    | @x   |
    +------+
    | 1001 |
    +------+
    1 row in set (0.00 sec)
    

    您可以将分隔符重新定义为//之外的字符串,并且分隔符可以由单个字符或多个字符组成。您应该避免使用反斜杠()字符,因为这是MySQL的转义字符。

    下面是一个函数示例,该函数接受参数,使用SQL函数执行操作,并返回结果。在这种情况下,没有必要使用分隔符,因为函数定义不包含内部;语句分隔符:

    mysql> CREATE FUNCTION hello (s CHAR(20))
    mysql> RETURNS CHAR(50) DETERMINISTIC
        -> RETURN CONCAT('Hello, ',s,'!');
    Query OK, 0 rows affected (0.00 sec)
    
    mysql> SELECT hello('world');
    +----------------+
    | hello('world') |
    +----------------+
    | Hello, world!  |
    +----------------+
    1 row in set (0.00 sec)
    

    相关文章

      网友评论

          本文标题:Mysql 定义存储程序

          本文链接:https://www.haomeiwen.com/subject/pdsklctx.html