目录
存储过程
一、无参存储过程:
1、无参存储过程的创建:
2、存储过程的调用call
3、查看存储过程的基本信息
4、存储过程的删除
5、存储过程的修改
二、带参存储过程
1、调用带参存储过程
2、带参存储过程的使用
3、运用带参存储过程查询数据
4、执行多条语句的存储过程
三、重定义结束符delimiter
delimiter指令的基本使用:
四、存储过程和函数的区别
存储过程
存储过程和函数类似,都是一个事先写好命令并编译后存在数据库中的Mysql语句集合,用于简化开发人员的工作,减少数据在数据库和应用服务器之间的传输,提高处理效率,既然都是函数,那就会有值的传入和传出,其中也存在一些区别
存储过程:参数的传递(参数类型)能用In 、out 、inout、并且没有直接的返回值,in 表示数据传入,out表示数据传出,inout表示既可传入又可传出,存储过程内不能使用use切换数据库
函数:参数只能使用in,并且必须要有返回值
一、无参存储过程:
存储过程关键字:procedure
创建无参存储过程的基本格式: create procedure 存储过程名 () begin sql语句1; SQL语句2; .... sql语句n; end;
讯享网
1、无参存储过程的创建:
讯享网 -- 创建一个查询学生信息的存储过程 create procedure pro_select_student() select *from db_2.student; -- 存储过程中支持执行部分SQL语句,不支持一些动态SQL语句
2、存储过程的调用call
call pro_select_student();
3、查看存储过程的基本信息
讯享网 show create procedure pro_select_student;
4、存储过程的删除
drop procedure 存储过程名;
5、存储过程的修改
-- mysql数据库中、存储过程一旦成功创建,它的功能就不支持修改
-- 如果想要修改一个存储过程的功能,可以删除存储过程后修改功能,在重新创建
二、带参存储过程
讯享网create procedure 存储过程名( in[out][inout]参数名1 参数类型1, in[out][inout]参数名2 参数类型1,...., in[out][inout]参数名n 参数类型n) began sql语句; end;
1、调用带参存储过程
call 存储过程名(参数值1,参数值2,........,参数值n);
2、带参存储过程的使用
讯享网-- 创建指定名称查询学生信息的存储过程 create procedure pro_select_student_byname(in sname varchar(20)) -- in:传入类型参数 select *from db_2.student where s_name = sname; call peo_select_student_byname("张益达"); -- 创建插入学生信息的存储过程 create procedure pro_insert_student(in sname varchar(20)), in scid int,in ssex varchar(4) ,in sage int) -- in:传入类型参数 insert into db_2.student values(null,sname,scid,ssex,sage); call pro_insert_student("张三",101,"男",23);
3、运用带参存储过程查询数据
create procedure getstuname(in stu_no int) begin select s_name 姓名 from student where s_no = stu_no; end; call getstuname(1);
4、执行多条语句的存储过程
讯享网-- 创建插入学生信息的存储过程,并将刚插入的学生信息查询出来 create procedure pro_insert_student(in sname varchar(20)), in scid int,in ssex varchar(4) ,in sage int) -- in:传入类型参数 begin -- 相当于c++中的{ insert into db_2.student values(null,sname,scid,ssex,sage); select *from db_2.student where s_name = sname; end; -- 相当于C++ 中的} -- SQL语句默认以分号;作为语句结束,并且总是以这条语句遇到的第一个分号作为整条语句的结束 -- 如果一个存储程序中需要执行多个语句时,则需要用begin...end 将这多条语句括起来 -- 将多条语句用begin end括起来会遇到SQL语句总是以这条语句遇到的第一个分号作为整条语句的结束问题
三、重定义结束符delimiter
注意:mysql执行SQL语句的过程中,会以‘;’作为结束符,所以一旦遇到‘;’数据库会认为当前SQL语句已经结束。
这里使用workbench编写存储过程时会出错,需要重定义结束符。
delimiter指令的基本使用:
delimiter符号
-- 运用delimiter重定义结束符
(如:delimiter // 或 delimiter $ 等)
然后存储过程的结尾是end//(而不是end;)
delimiter可定义任何符号为结束符,但最好不要覆盖符号本身的意义
执行完后需要delimiter;将结束符改回来。(要将分号改回来)
比如:
DELIMITER // -- 将‘//’ 设置为语句结束符 CREATE FUNCTION get_number_by_id(id INT) RETURNS VARCHAR(300) BEGIN RETURN (SELECT CONCAT('name: ', name, '--', 'number: ', number) FROM users_info WHERE uid = id); END// DELIMITER ; -- 将分号改回来
delimiter重定义结束符(workbench独有,其他可视化界面不需要)
-- 重定义结束符delimiter的基本格式
-- delimiter符号 -- 定义这个“符号”为语句结束符
-- 如 delimiter // -- 重定义'//'符号为语句最终结束符
注意:不建议以逗号,等于号,大于号等其他已经有特殊意义的符号作为语句最终结束符
因为这样会覆盖掉这个运算符本身的意义
如 delimiter ,-- 不建议重定义‘,’符号为语句最终结束符,因为会覆盖它作为分隔符的用法
四、存储过程和函数的区别
1:函数只能返回一个数据,而存储过程可以返回多个
2:函数的限制比较多,不能返回临时表(select),只能用表变量,而存储过程限制少,且可以使用动态SQL语句(如:
select);
3:存储过程处理的功能比较复杂,而函数实现数据的计算针对性强
4:存储过程可以执行修改表的操作,但是函数不能执行一组修改全局数据库状态的操作
5:存储过程可以通过out返回多个参数,而函数只能返回单个数据或者表对象

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/129120.html