2019独角兽企业重金招聘Python工程师标准>>>
存储过程和函数初步
简单的来说,存储过程就是一条或者多条 SQL 语句的集合,可视为批处理文件,但是其作用不仅限于批处理。
###存储程序可以分为存储过程和函数。 MySQL 中创建存储过程和函数使用的程序分别是:CREATE PROCEDURE 和 CREATE FUNCTION。使用 CALL 语句来调用存储过程,只能用输出变量返回值。函数可以从语句外调用,即通过引用名,也能返回标量值。存储过程也可以调用其他存储过程。
###创建存储过程 使用 CREATE PROCEDURE 语句,格式如下
CREATE PROCEDURE sp_name( [proc_parameter] )
[characteristics ...] routine_body
CREATE PROCEDURE 为创建关键字,sp_name 为存储过程的名称,proc_parameter 为指定存储过程的参数列表,列表形式如下
[ IN | OUT | INOUT ] param_name type
其中 IN 表示输入参数,OUT 表示输出参数,INOUT 表示既可以输入也可以输出参数;param_name 表示参数名称,type 表示参数的类型,该类型可以是 MySQL 中数据库中的任意类型。 characteristics 指定存储过程的特性,有以下取值:
- LANGUAGE SQL: 说明 routine_body 部分是由 SQL 语句组成的,当前系统支持的语言为 SQL,SQL 是 LANGUAGE 特性的唯一值。
- [NOT] DETERMINISTIC:指明存储过程执行的结果是否正确。DETERMINISTIC 表示结果是确定的。每次执行存储过程时,相同的输入会得到相同的输出。NOT DETERMINISTIC 表示结果是不确定的,相同的输入可能得到不同的输出。如果没有指定任意一个值,默认为 NOT DETERMINISTIC。
- {CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA}: 指明子程序使用 SQL 语句的限制。CONTAINS SQL 表明子程序包含 SQL 语句,但是不包含读写数据的语句;NO SQL 表明子程序不包含 SQL 语句;READS SQL DATA 说明子程序包含读数据的语句;MODIFIES SQL DATA 说明子程序包含写数据的语句。默认情况下使用 CONTAINS SQL。
- SQL SECURITY { DEFINER | INVOKER }: 指明谁有权限来执行。DEFINER 表示只有定义者才有权限执行,INVOKER 表示拥有权限的调用者可以执行。默认情况下,系统指定为DEFINER。
- COMMENT 'string':注释信息,可以用来描述存储过程或函数。 routine_body 是 SQL 代码的内容,可以用 BEGIN...END 来表示 SQL 代码的开始和结束。
存储过程需要复杂的 SQL 语句,并且要有创建存储过程的权限,但是存储过程可以简化操作,同时可以减少操作过程中的失误,因此存储过程是非常有用的。
一个简单的创建存储过程的例子,创建名为allOrder的存储过程
MySQL> DELIMITER //
MySQL> CREATE PROCEDURE allOrder()-> BEGIN-> SELECT SUM(`goods_num`) as `all_num` FROM `tbl_order`;-> END //
MySQL> DELIMITER;
"DELIMITER //" 语句的作用是将 MySQL 的结束符设置为为 //,因为 MySQL 默认语句的结束符为';',为了避免与存储过程中的结束符冲突,需要使用 DELIMITER 改变存储过程中的结束符,并以"END //"结束存储过程。定义完毕之后再使用"DELIMITER;"恢复系统默认结束符。也可以指定其他符号作为结束符。
MySQL> DELIMITER //
MySQL> CREATE PROCEDURE countNum(OUT number INT)-> BEGIN-> SELECT COUNT(1) INTO number FROM `tbl_order`;-> END //
MySQL> DELIMITER;
上述代码的作用是创建一个名为 countNum 的存储过程,讲计算结果放入 number 中。
###编写存储函数 创建存储函数,需要用到 CREATE FUNCTION 语句,基本语法格式如下
CREATE FUNCTION func_name ( [func_parameter] )
RETURNS type
[characteristic...] routine_body
func_parameter 的参数形式为
[ IN | OUT | INOUT ] param_name type
RETURNS type 语句表示函数返回数据的类型。characteristic 指定存储函数的特征,取值与创建存储过程相同。
1.指定参数为 IN、OUT 或 INOUT 只对PROCEDURE 是合法的。FUNCTION 中总是默认为 IN 参数。RETURNS 子句只能对 FUNCTION 做指定,对函数而言这是强制的。它用来指定函数的返回类型,而且函数体必须包含一个 RETURN value 语句。 2.如果在存储函数中的 RETURN 语句返回一个类型不同于函数的 RETURNS 子句中指定的类型的值,返回值将被强制为恰当的类型,比如,如果一个函数返回一个 ENUM 或 SET 值,但是 RETURN 语句返回一个整数,对于 SET 成员集的相应的 ENUM 成员,从函数返回的值是字符串。
创建一个名称为 getOrder 的函数
MySQL> DELIMITER //
MySQL> CREATE FUNCTION getOrder()-> RETURNS int(10)-> BEGIN-> RETURN (SELECT COUNT(*) FROM `tbl_order`);-> END //
MySQL> DELIMITER;