存储过程(Stored Procedure)是一种在数据库中存储复杂程序,以便外部程序调用的一种数据库对象。
存储过程是为了完成特定功能的SQL语句集,经编译创建并保存在数据库中,用户可通过指定存储过程的名字并给定参数(需要时)来调用执行。
存储过程思想上很简单,就是数据库 SQL 语言层面的代码封装与重用。
1)向导创建
选择对应数据库下函数右键新建函数->选择过程->填写输入/输出参数->填写函数体信息->保存->填写函数名
语法:
CREATE PROCEDURE 过程名([IN|OUT|INOUT] 参数名 数据类型],[IN|OUT|INOUT] 参数名 数据类型,…)
[特性 ...] 过程体
参数说明:
IN 输入参数
表示该参数的值必须在调用存储过程时指定,在存储过程中修改该参数的值不能被返回,为默认值
OUT 输出参数
该值可在存储过程内部被改变,并可返回
INOUT 输入输出参数
调用时指定,并且可被改变和返回
过程体说明:过程体的开始与结束使用BEGIN与END进行标识。
实例说明:
IN
# SELECT在存储过程中 是将变量返回的作用
CREATE PROCEDURE in_param(IN p_in int)
BEGIN
SELECT p_in;
SET p_in=2;
SELECT p_in;
END;
CREATE PROCEDURE in_param2(IN p_in int)
BEGIN
SET p_in=2;
SELECT p_in;
END;
#调用
SET @p_in=1;
CALL in_param(@p_in);
SELECT @p_in;
结果为:1,1
CALL in_param2(@p_in);
SELECT @p_in;
结果为:2,1
以上可以看出,p_in虽然在存储过程中被修改,但并不影响@p_id的值
OUT
# SELECT在存储过程中 是将变量返回的作用
CREATE PROCEDURE in_param3(OUT p_in int)
BEGIN
SELECT p_in;
END;
CREATE PROCEDURE in_param4(OUT p_in int)
BEGIN
SET p_in=2;
SELECT p_in;
END;
#调用
SET @p_in=1;
CALL in_param3(@p_in);
SELECT @p_in;
结果为:null,null
CALL in_param4(@p_in);
SELECT @p_in;
结果为:2,2
以上可以看出,p_in在存储过程中被修改,并影响@p_id的值
当p_in被直接返回时为空,因为p_in是输出变量,中途中变量没有被赋值,相当于没有定义直接被返回了。
INOUT
CREATE PROCEDURE in_param5(INOUT p_in int)
BEGIN
SELECT p_in;
END;
CREATE PROCEDURE in_param6(INOUT p_in int)
BEGIN
SET p_in=2;
SELECT p_in;
END;
#调用
SET @p_inout=1;
CALL in_param5(@p_inout) ;
SELECT @p_inout;
结果为:1,1
CALL in_param6(@p_inout) ;
SELECT @p_inout;
结果为:2,2
当p_inout被直接返回时,变量值不变,当中途中变量被赋值,@p_inout的原始值也被改变了时。
1)选中想要查看的存储->设计存储
2) sql 查看
// 展示所有函数/ 存储
SELECT * FROM mysql.proc ;
// 查看自定义的所有存储
SHOW PROCEDURE STATUS
SHOW PROCEDURE STATUS where Db ="py_etl"
// 可以根据名称查看所有自定义的存储,支持模糊查询
show PROCEDURE status like '名字';
show PROCEDURE status like '%me';
show PROCEDURE status like "in_param"
// 查看函数的创建语句
show create PROCEDURE '函数名字';
show create PROCEDURE ym_datesql
//使用函数
call PROCEDURE(参数)
1)选中想要更改的过程> 右键设计函数>写过程主体 -> 保存
2)更改函数的时候,他是将你原来的过程进行了删除,至更新过程的主体内容,所以当我们想要更新过程时,不如重新建立一个过程。怎么验证呢,在设计函数将过程主体内容进行更改,点击SQL预览,就可以看到执行的SQL语句了,例如:之前 in_param ,注释掉后面两句赋值代码,他的sql内容就是
DROP PROCEDURE IF EXISTS `in_param`;
CREATE DEFINER = `root`@`localhost` PROCEDURE `in_param`(IN p_in int)
BEGIN
SELECT p_in;
END;
可以清楚地看到 它是将原有的函数进行删除,但 参数没变的情况下 进行更改主体内容,所以我们要更改过程不如之间重新创建一个,避免参数上的一个问题。
1)选中想要更改的过程-> 右键删除函数
2)
// 删除对应函数
drop PROCEDURE '函数名';
drop PROCEDURE in_param ;