ITPub博客

首页 > 数据库 > > 23 存储过程和视图

23 存储过程和视图

作者:飘絮絮絮丶 时间:2020-05-11 11:12:21 0 删除 编辑

参考官方文档:

dev.mysql.com/doc/refma


存储过程包含下列对象:


  • 存储例程,即存储过程和函数。 使用CALL语句调用存储过程。 过程没有返回值,但可以修改其参数以供调用者稍后检查。 它还可以生成要返回给客户端程序的结果集。 存储函数的使用方式与内置函数非常相似。 您在表达式中调用它,并在表达式求值期间返回一个值。
  • 触发器。 触发器是一个命名的数据库对象,它与表关联,并在表发生特定事件时激活,例如插入或更新。
  • 事件。 事件是服务器根据计划运行的任务。


视图是存储的查询,在引用时生成结果集。 视图充当虚拟表


以下部分提供有关与这些对象相关的语句的SQL语法的其他信息:


  • 对于每种对象类型,都有CREATE,ALTER和DROP语句,用于控制存在哪些对象以及如何定义它们。
  • CALL语句用于调用存储过程。
  • 存储的程序定义包括可以使用复合语句,循环,条件和声明变量的主体。


在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/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2019-09-09

  • 博文量
    2646
  • 访问量
    42234