• 首页
  • vue
  • TypeScript
  • JavaScript
  • scss
  • css3
  • html5
  • php
  • MySQL
  • redis
  • jQuery
  • 定义存储程序

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

    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函数执行操作,然后返回结果。在这种情况下,delimiter由于函数定义不包含内部;语句定界符,因此无需使用:

    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)
    

    上一个 HOME UP NEXT