存储过程:在数据库中定义好的一些SQL语句的集合,类似一个函数
1. 创建存储过程
1.1 创建存储过程
/*创建存储过程*/ /*格式:CREATE PROCEDURE 名称(参数列表) 特性 BEGIN 代码内容 END 参数列表:输入输出类型 参数名称 参数类型 输入输出类型: IN 表示输入参数 OUT 表示输出参数 INOUT 既可以作输入也可以输出 参数类型:即参数数据类型 特性: LANGUAGE SQL:说明代码内容部分由SQL语言语句组成,默认 DETERMINISTIC:表示存储过程的执行结果是确定的(同样的输入会得到同样的输出);加NOT表示不确定 子程序使用SQL语句的限制: CONTAINS SQL:子程序包含SQL语句,但不包含读或写数据的语句,默认选项 NO SQL:子程序中不含SQL语句 READS SQL DATA:子程序中包含读数据的语句 MODIFIES SQL DATA:子程序中包含写数据的语句 执行权限: SQL SECURITY DEFINER:只有定义者自己才能执行,默认选项 SQL SECURITY INVOKER:调用者可执行 COMMENT ‘string‘:注释信息 */
DELIMITER && CREATE PROCEDURE num_from_employee(IN emp_id INT,OUT count_num INT) READS SQL DATA BEGIN SELECT COUNT(*) INTO count_num FROM employee WHERE id = emp_id; END && DELIMITER;
1.2 例子
(1)无参
DELIMITER && CREATE PROCEDURE pro1() BEGIN SELECT COUNT(*) FROM person; END && DELIMITER ;
调用:
CALL pro1();
删除:
DROP PROCEDURE IF EXISTS pro1;
(2)有入参
DELIMITER && CREATE PROCEDURE pro1(IN pid INT) BEGIN SELECT * FROM person WHERE PersonId=pid; END && DELIMITER ;
调用:
CALL pro1(4);
(3)有出参
DELIMITER && CREATE PROCEDURE pro1(IN pid INT,OUT fullName VARCHAR(42)) BEGIN SELECT CONCAT(FirstName,‘-‘,LastName) FROM person WHERE PersonId=pid INTO fullName; END && DELIMITER ;
调用:
CALL pro1(4,@fullName);
SELECT @fullName; //查看结果
2. 创建存储函数(即自定义函数)
(1)格式
/*创建存储函数*/ /*格式:CREATE FUNCTION fun_name(fun_parameter) 返回类型 函数特性 代码内容 */
DELIMITER && CREATE FUNCTION name_from_employee (emp_id INT) RETURNS VARCHAR(20) BEGIN RETURN(SELECT name FROM employee WHERE id=emp_id); END && DELIMITER ;
--删除函数 DROP FUNCTION IF EXISTS 函数名;
(2)例子
表 person
创建一个函数,返回 名-姓 格式的名字:
DELIMITER && CREATE FUNCTION name_from_person(pid INT) RETURNS VARCHAR(42) BEGIN RETURN(SELECT CONCAT(FirstName,‘-‘,LastName) FROM person WHERE PersonId=pid); END && DELIMITER ;
使用:
SELECT name_from_person(4);
3 变量
在存储过程里面或自定义函数里面可定义和使用变量
作用范围:BEGIN到END之间
(1)定义变量
DECLARE var_name[,...] type DEFAULT value
(2)变量赋值
SET var_name=expr,var_name2=expr2
mysql还可使用 SELECT ..INTO 赋值:
SELECT id INTO var_a FROM table1 where xxx;
4. 定义条件和处理程序
自定义当sql执行遇到错误时,怎样去处理
(1)定义条件
DECLARE 条件名 CONDITION FOR 条件值;
--以错误 ERROR 1146(42S02) 为例 /*条件值: ①SQLSTATE ‘42S02‘ ②1146 */ --两种写法: DECLARE can_not_find CONDITION FOR SQLSTATE ‘42S02‘; DECLARE can_not_find CONDITION FOR 1146;
(2)定义处理程序
DECLARE 处理方式 HANDLER FOR 条件 存储过程或函数执行语句; --处理方式:①EXIT:遇到错误马上退出 ②CONTINUE:不处理,继续向下执行 ③UNDO:撤回之前的操作,暂不支持 --条件:①SQLSTATE ‘XXX‘ ②错误码 ③自定义的条件名 -- ④SQLWARNING:01开头的sql_state值 ⑤NOT FOUND:所有以02开头的sql_state_valu ⑥SQLEXCEPTION:除了SQLWARNING和NOT FOUND之外的sql_state_value
10