首页 > 数据库 > > 23 存储过程和视图
参考官方文档:
https://dev.mysql.com/doc/refman/5.7/en/stored-programs-views.html
存储过程包含下列对象:
视图是存储的查询,在引用时生成结果集。 视图充当虚拟表
以下部分提供有关与这些对象相关的语句的SQL语法的其他信息:
在MySQL中,检测到存储程序引用的对象的元数据更改,并在下次执行程序时自动重新解析受影响的语句。
23.1 定义存储过程
每个存储的程序都包含一个由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 ENDREPEAT;
-> 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)
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/69946831/viewspace-3135156/ ,如需转载,请注明出处,否则将追究法律责任。