MySQL学习-存储过程(二)-创建存储过程
前言
上篇我们学习了一部分MySQL中的存储过程。有兴趣的小伙伴可以阅读(# MySQL学习-存储过程(一))。 下面继续学习MySQL中的存储过程。
上节,只学习到了存储过程的语法,下面对语法进行以下说明:
存储过程语法
CREATE PROCEDURE 存储过程名(IN|OUT|INOUT 参数名 参数类型,...)
[characteristics ...]
BEGIN
存储过程体
END
- 参数名前面IN|OUT|INOUT的含义:
- IN:当前参数为输入参数,也就是表示入参。存储过程只是读取这个参数的值。如果没有定义参数种类,默认就是IN,表示输入参数。
- OUT:当前参数为输出参数,也就是表示出参。执行完成之后,调用这个存储过程的程序可以读取这个参数返回的值。
- INOUT:当前参数既可以为输入参数,也可以为输出参数。
- 形参类型可以是MySQL数据库中的任意类型。
- characteristics表示创建存储过程时指定的对存储过程的约束条件,其取值信息如下:
LANGUAGE SQL
| [NOT] DETERMINISTIC
| { CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA }
| SQL SECURITY { DEFINER | INVOKER }
| COMMENT 'string'
- LANGUAGE SQL:说明存储过程执行体是由SQL语句组成的,当前系统支持的语言为SQL。
- [NOT] DETERMINISTIC:指明存储过程执行的结果是否确定。DETERMINISTIC表示结果是确定的。每次执行存储过程时,相同的输入会得到相同的输出。[NOT] DETERMINISTIC表示结果是不确定的,相同的输入可能得到不同的输出。如果没有指定任意一个值,默认为[NOT] DETERMINISTIC。
- { CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA }:指明子程序使用SQL语句的限制。
- CONTAINS SQL:表示当前存储过程的子程序包含SQL语句,但是并不包含读写数据SQL语句。
- NO SQL:表示当前存储过程的子程序中不包含任何SQL语句。
- READS SQL DATA:表示当前存储过程的子程序中包含读数据的SQL语句。
- MODIFIES SQL DATA:表示当前存储过程的子程序中包含写数据的SQL语句。
- 默认,系统会指定为CONTAINS SQL。
- SQL SECURITY { DEFINER | INVOKER }:执行当前存储过程的权限,即指明哪些用户能够执行当前存储过程。
- DEFINER:表示只有当前存储过程的创建者或者定义者才能执行当前存储过程。
- INVOKER:表示拥有当前存储过程的访问权限的用户能够执行当前存储过程。
- 如果没有设置相关的值,则MySQL默认指定值为DEFINER。
- COMMENT 'string':注释信息,可以用来描述存储过程。
- 存储过程中可以有多条SQL语句,如果仅仅有一条SQL语句,则可以省略BEGIN和END。编写过程中可能需要复杂的SQL语句。
- BEGIN...END:BEGIN...END中间包含了多个语句,每个语句都以(;)号为结束符。
- DECLARE:DECLARE用来声明变量,使用的位置在于BEGIN...END语句中间,而且需要在其他语句使用之前进行变量的声明。
- SET:赋值语句,用于对变量进行赋值。
- SELECT...INTO:把从数据表中查询的结果存放到变量中,也就是为变量赋值。
- 需要设置新的结束标记。
DELIMITER 新的结束标记
- MySQL的默认语句结束符是分号(;)。为了避免与存储过程中SQL语句结束符相冲突,需要使用DELIMITER改变存储过程的结束符。比如:“DELIMITER //”语句的作用是将MySQL的结束符设置为//,并以“END //”结束存储过程。存储过程定义完毕之后在使用“DELIMITER ;”恢复默认结束符。
- 当使用DELIMITER命令时,避免使用“\”字符,因为反斜线是MySQL的转义字符。
DELIMITER //
CREATE PROCEDURE 存储过程名(IN|OUT|INOUT 参数名 参数类型,...)
[characteristics ...]
BEGIN
存储过程体
END //
今天先学习到这里,明天继续。
转载自:https://juejin.cn/post/7130193083618033701