SQL_存储过程和函数

概念

存储过程和函数是事先经过编译并存储在数据库中的一段 SQL 语句的集合。

与函数的区别

(1)函数必须有返回值,而存储过程没有

(2)存储过程的参数可以使用 IN、OUT、INOUT 类型,而函数的参数只能是 IN 类型的。

相关操作

语句 定义

CREATE PROCEDURE sp_name
([proc_parameter[,…]])
[characteristic …] routine_body

创建存储过程

CREATE FUNCTION sp_name
([func_parameter[,…]]
RETURNS type [characteristic …]
routine_body

创建函数

ALTER {PROCEDURE | FUNCTION} sp_name
[characteristic …]

修改 存储过程/函数

CALL sp_name([parameter[,…]])

调用过程

DROP PROCEDURE name

删除存储过程

SHOW {PROCEDURE|FUNCTION} STATUS [LIKE ‘pattern’]

查看存储过程或者函数的状态

SHOW CREATE {PROCEDURE |FUNCTION} sp_name

查看存储过程或者函数的定义

select * from routines where ROUTINE_NAME = ‘film_in_stock’ \G

获取存储过程和函数的包括名称、类型、语法、创建人 等信息。

DECLARE var_name[,…] type [DEFAULT value]

变量的定义{用于begin…end块中}

SET var_name = expr [, var_name = expr]

变量的赋值

DECLARE condition_name CONDITION FOR condition_value

条件的定义

DECLARE handler_type
HANDLER FOR condition_value[,…] sp_statement

条件的处理

DECLARE cursor_name CURSOR FOR select_statement

声明光标

OPEN cursor_name

打开光标

FETCH cursor_name INTO var_name [, var_name] …

fetch光标

CLOSE cursor_name

关闭光标

IF search_condition THEN statement_list
[ELSEIF search_condition THEN statement_list] …
[ELSE statement_list]
END IF

IF语句

CASE case_value
WHEN when_value THEN statement_list
[WHEN when_value THEN statement_list] …
[ELSE statement_list]
END CASE

CASE语句

[begin_label:] LOOP
statement_list
END LOOP [end_label]

LOOP语句

[begin_label:] REPEAT
statement_list
UNTIL search_condition
END REPEAT [end_label]

REPEAT语句

[begin_label:] WHILE search_condition DO
statement_list
END WHILE [end_label]

WHILE语句

参数说明:

创建存储过程的proc_parameter:

[ IN | OUT | INOUT ]   param_name type 

创建函数的func_parameter:

param_name type  

创建函数的type:

Any valid MySQL data type  

创建存储过程/函数的characteristic:
LANGUAGE SQL //说明下面过程的BODY是使用SQL语言
| [NOT] DETERMINISTIC //DEDETERMINISTIC 确定的,即每次输入一样输出也一样的程序,NOT DETERMINISTIC 非确定的,默认是非确定的。
| { CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA } //CONTAINS SQL 表示子程序不包含读或写数据的语句。NO SQL 表示子程序不包含 SQL 语句。READS SQL DATA 表示子程序包含读数据的语句,但不包含写数据的语句。MODIFIES SQL DATA 表示子程序包含写数据的语句。
| SQL SECURITY { DEFINER | INVOKER } //可以用来指定子程序该用创建子程序者的许可来执行,还是使用调用者的许可来执行。默认值是 DEFINER
| COMMENT ‘string’ //存储过程或者函数的注释信息。

创建存储过程/函数的 routine_body:
Valid SQL procedure statement or statements

修改存储过程/函数中的characteristic:
{ CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA }
| SQL SECURITY { DEFINER | INVOKER }
| COMMENT ‘string

条件的定义condition_value:

    SQLSTATE [VALUE] sqlstate_value <

|mysql_error_code

条件的处理参数handler_type:

    CONTINUE  

| EXIT  

| UNDO  

condition_value:

SQLSTATE [VALUE] sqlstate_value  

| condition_name  

| SQLWARNING  //对所有以 01 开头的 SQLSTATE 代码的速记

| NOT FOUND  //对所有以 02 开头的 SQLSTATE 代码的速记

| SQLEXCEPTION  //对所有没有被 SQLWARNING 或 NOT FOUND 捕获的 SQLSTATE 代码的速记。

| mysql_error_code

例子

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
mysql> DELIMITER $$   //delimiter将sql的结束标志设为$$

mysql>
mysql> CREATE PROCEDURE film_in_stock(IN p_film_id INT, IN p_store_id INT, OUT p_film_count

INT)
-> READS SQL DATA

-> BEGIN

-> SELECT inventory_id

-> FROM inventory

-> WHERE film_id = p_film_id

-> AND store_id = p_store_id

-> AND inventory_in_stock(inventory_id); ////调用了函数inventory_in_stock()

->

-> SELECT FOUND_ROWS() INTO p_film_count;

-> END $$

Query OK, 0 rows affected (0.00 sec)
mysql>
mysql> DELIMITER ; //delimiter将sql的结束标志设为;
文章目录
  1. 1. 概念
  2. 2. 相关操作
  3. 3. 参数说明:
    1. 3.1. 例子
| 139.6k