本文共 3914 字,大约阅读时间需要 13 分钟。
MySQL 存储过程是一种在数据库中存储复杂程序的方法,允许开发者将代码封装在数据库中,便于外部程序调用。自MySQL 5.0版本开始,存储过程成为数据库开发的重要工具。以下将从基础知识到实际操作详细介绍MySQL存储过程的使用方法。
存储过程是数据库中的一个对象,与函数类似,但它可以直接包含复杂的SQL语句。与普通函数不同,存储过程可以接受输入参数,并在需要时返回输出值。其主要思想是对常用SQL操作进行封装,便于代码复用和管理。
存储过程的创建过程分为几个关键步骤:
CREATE [DEFINER = { user | CURRENT_USER }] PROCEDURE sp_name ([proc_parameter[,...]]) [characteristic ...] routine_bodyproc_parameter: [ IN | OUT | INOUT ] param_name typecharacteristic: 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 [begin_label:] BEGIN [statement_list] ... END [end_label]
为了避免MySQL客户端解释分号,可以临时更改语句结束符:
DELIMITER $$或DELIMITER //
以下是一个简单的存储过程示例,用于删除特定球员参加的所有比赛:
delimiter $$CREATE PROCEDURE delete_matches(IN p_playerno INTEGER)BEGIN DELETE FROM MATCHES WHERE playerno = p_playerno;END$$delimiter;
调用存储过程的语法如下:
call sp_name(参数);
例如:
call delete_matches(57);
存储过程的参数有三种类型:IN
、OUT
、INOUT
。参数定义方式如下:
CREATE PROCEDURE 存储过程名([[IN | OUT | INOUT ] 参数名 数据类形...])
delimiter $$CREATE PROCEDURE in_param(in p_in int)BEGIN select p_in; set p_in=2; select p_in;END$$delimiter;
delimiter $$CREATE PROCEDURE out_param(out p_out int)BEGIN select p_out; set p_out=2; select p_out;END$$delimiter;
delimiter $$CREATE PROCEDURE inout_param(inout p_inout int)BEGIN select p_inout; set p_inout=2; select p_inout;END$$delimiter;
存储过程中的变量声明和赋值:
DECLARE l_int int unsigned default 4000000;DECLARE l_numeric number(8,2) DEFAULT 9.95;
用户变量在客户端使用:
mysql > SET @p_in=1;mysql > call in_param(@p_in);
delimiter $$CREATE PROCEDURE proc3()BEGIN declare x1 varchar(5) default 'outer'; BEGIN declare x1 varchar(5) default 'inner'; select x1; END; select x1;END$$delimiter;
delimiter $$CREATE PROCEDURE proc2(IN parameter int)BEGIN declare var int; set var=parameter+1; if var=0 then insert into t values(17); end if; if parameter=0 then update t set s1=s1+1; else update t set s1=s1+2; end if; end;END$$delimiter;
delimiter $$CREATE PROCEDURE proc3 (in parameter int)BEGIN declare var int; set var=parameter+1; case var when 0 then insert into t values(17); when 1 then insert into t values(18); else insert into t values(19); end case; end;END$$delimiter;
delimiter $$CREATE PROCEDURE proc4()BEGIN declare var int; set var=0; while var<6 do insert into t values(var); set var=var+1; end while; end;END$$delimiter;
delimiter $$CREATE PROCEDURE proc5 ()BEGIN declare v int; set v=0; repeat insert into t values(v); set v=v+1; until v>=5 end repeat; end;END$$delimiter;
delimiter $$CREATE PROCEDURE proc6 () BEGIN declare v int; set v=0; LOOP_LABLE:loop insert into t values(v); set v=v+1; if v>=5 then leave LOOP_LABLE; end if; end loop; end;END$$delimiter;
delimiter $$CREATE PROCEDURE proc3 () BEGIN label1: BEGIN label2: BEGIN label3: BEGIN statements; END label3; END label2; END label1;END$$delimiter;
delimiter $$CREATE PROCEDURE proc10 () BEGIN declare v int; set v=0; LOOP_LABLE:loop if v=3 then set v=v+1; ITERATE LOOP_LABLE; end if; insert into t values(v); set v=v+1; if v>=5 then leave LOOP_LABLE; end if; end loop; end;END$$delimiter;
可以通过以下命令查看数据库中的存储过程:
select name from mysql.proc where db='数据库名';
ALTER PROCEDURE sp_name ...;
DROP PROCEDURE sp_name;
MySQL存储过程为数据库开发提供了强大的代码封装能力,适用于复杂逻辑的重复使用。通过正确使用存储过程,可以显著提升数据库的性能和代码的可维护性。
转载地址:http://flffk.baihongyu.com/