Mysql 存储过程
之前一直用的是oracle的数据库,对oracle数据库的方法和存储过程的编写有一定研究。最近接触了一些Mysql数据库的项目,总结一下Mysql数据库写存储过程的内容。
创建存储过程
这里我使用的是Navicat Premium连接数据库以及编写存储过程:
语法
打开查询窗口,以一个简单的不含参存储过程为例:
// 查询codemain表和codeitem表有多少条数据
DELIMITER //
CREATE PROCEDURE proc0()
BEGIN
SELECT COUNT(*) FROM `codemain`;
SELECT COUNT(*) FROM `codeitem`;
END //
DELIMITER ;
用 DELIMITER // 和 // DELIMITER 作为起始符和结束符包裹创建存储过程的语句。
调用
Mysql对存储过程的调用也和oracle数据库有很大差别。在oracle数据库中,一般情况下定义存储过程和函数的时候会先定义一个包(package),把存储过程和函数写在包里。而Mysql中是没有包这个概念的,所有的存储过程和函数都定义在数据库当中,因此在调用的时候也有些不同。
// 调用proc0
CALL proc0 ();
结果如下:
要说明的是,在创建存储过程的时候,只要代码中没有语法问题,哪怕存储过程中调用的表或者字段都是不存在的都是不会报错的。
这和在oracle数据库中编写存储过程有很大的差异,oracle数据库中编写的存储过程在保存的时候会先进行编译,而在Mysql数据库中,存储过程的代码只是被保存下来,在调用的时候才会进行编译。
创建含参的存储过程
在创建含参的存储过程的时候调用又有些变化:
语法
// 三种类型参数以及局部变量
DELIMITER //
CREATE PROCEDURE proc1 (
IN p_in INT,
OUT p_out INT,
INOUT p_inout INT
)
BEGIN
DECLARE l_int INT UNSIGNED DEFAULT 200 ;
SET p_in = p_in + l_int ;
SET p_out = p_in + IFNULL(p_out, 0) + l_int ;
SET p_inout = p_inout + l_int ;
END//
DELIMITER ;
三种常用参数类型IN OUT INOUT:
- IN类型参数,只传入不传出
- OUT类型参数,不传入只传出
- INOUT类型参数,既传入又传出
要注意的是局部参数的定义在begin之后。
调用
// 调用proc1
SET @p_in = 100;
SET @p_out = 100;
SET @p_inout = 100;
CALL proc1 (@p_in ,@p_out ,@p_inout);
SELECT
@p_in ,@p_out ,@p_inout;
结果如下:
其他
在存储过程中,主体的逻辑处理写在BEGIN…END中,可以用到的语法有很多:
- if-then -else语句
- case语句
- 循环语句
while ···· end while
repeat···· end repeat
loop ·····end loop - LABLES 标号 等