首批通过分布式安全可靠测评,为关键业务系统打造
存储过程
更新时间:2026-06-30 16:45:26
存储过程是一种没有直接返回值的子程序。当参数类型为 OUT 时,存储过程也可以给调用者返回值。
存储过程的结构
一个存储过程的结构如下:
CREATE
[DEFINER = user]
PROCEDURE sp_name ([proc_parameter[,...]])
[characteristic ...] routine_body
proc_parameter:
[ IN | OUT | INOUT ] param_name type
characteristic: {
COMMENT 'string'
| LANGUAGE SQL
| [NOT] DETERMINISTIC
| { CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA }
| SQL SECURITY { DEFINER | INVOKER }
}
routine_body:
Valid SQL routine statement
存储过程的创建
存储过程通过 CREATE PROCEDURE 语句创建存储过程。
DECLARE模块要放在BEGIN END;模块中,并且所有定义声明完成后才能定义其他语句。可以定义 DETERMINISTIC / LANGUAGE SQL 等 sp_create_chistic 信息以丰富存储过程的使用。
MySQL 模式下的存储过程不存在重载情况,所以删除时不用考虑参数类型。
示例如下:
obclient> CREATE TABLE city(CountryCode CHAR(3))/
Query OK, 0 rows affected
obclient> CREATE PROCEDURE citycount (IN country CHAR(3), OUT cities INT)
BEGIN
SELECT COUNT(*) INTO cities FROM city
WHERE CountryCode = country;
END/
Query OK, 0 rows affected
存储过程的调用
创建好的存储过程,需要使用 CALL 语句来调用,但是它不能作为 SQL 表达式的一部分被调用。
obclient> CALL citycount('JPN', @cities);/
+--------+
| cities |
+--------+
| 0 |
+--------+
1 row in set
obclient> SELECT @cities/
+---------+
| @cities |
+---------+
| 0 |
+---------+
1 row in set
obclient> DROP PROCEDURE citycount/
Query OK, 0 rows affected