mysql--存储过程和函数

 

  存储过程:在数据库中定义好的一些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

  mysql--存储过程和函数

 

  创建一个函数,返回 名-姓 格式的名字:

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

mysql--存储过程和函数

上一篇:MySQL子查询


下一篇:MongoDB副本集replica set(五)--故障排查