mysql存储过程、存储函数及流程控制
存储过程 一、基本语法 create procedure sp_name([proc_parameter[,...]]) [characteristic...]routine_body begin end sp_name 表示存储过程的名字 proc_parameter 存储过程参数例表[IN OUT INOUT]三个部分组成 其中IN 表示传进来的参数 其中OUT 表示传出去的参数 其中INOUT 表示传进来但最终传回的参数 routine_body 参数是SQL代码的内容(类似于触发器的for each row) begin..end标志SQL代码的开始和结束 二、关于IN OUT INPOUT的举例说明 IN 参数例子 delimiter && create procedure alvin1( in p_in int) #设置传入的参数类型和变量 begin select p_in; #查询第一次传入的参数值 set p_in=2; #内部重新赋值给p_in变量 select p_in; #赋值后在此查询 end && delimiter ; set @p_in=1; #开始传入参数1 call alvin1(@p_in); #调用存储过程,查看和对比输出的值 OUT 参数例子 delimiter && create procedure alvin2( out p_out int) begin select p_out; set p_out=2; select p_out; end && delimiter ; set @p_out=1; 传入的参数1之后 call alvin2(@p_out)调用了之后。是否和IN一样都显示出来了?还是无效? INOUT 参数例子 delimiter && create procedure alvin3( inout p_inout int) begin select p_inout; set p_inout=2; select p_inout; end && delimiter ; 三、举例说明 需求:创建一个存储过程,要求(返回mysql的版本,用户 所在的数据库、用户名称) delimiter && create procedure zy1( out getversion varchar(30), out userversion varchar(30), out userdatabase varchar(30), out userconnection int) reads sql data begin select version() into getversion; select user() into userversion; select database() into userdatabase; select connection_id() into userconnection; end && delimiter ; 需求二、统计vendors vend_id的数量总共有多少条? out zycount int select count(*) into zycount from vendors #==================================================== 存储函数 create function sp_name([func_parameter[,.....]]) return type [characteristic...]routine_body begin...end 其中sp_name 存储函数的名称 func_parameter 函数参数列表 return type 指定返回的参数类型 routine_body SQL代码内容 begin..end标志SQL代码的开始和结束 注意:与存储过程不同, 1、参数只有输入类型 2、向调用方返回结果值 举例: delimiter && create function alvin11( bb_id int) returns varchar(20) begin return(select vend_name from vendors where vend_id=bb_id); end && delimiter ; 练习需求:编写一个存储函数,要求出入cust_id的的时候返回order_date这个字段的值 表名为:orders #==================================================== 流程控制 (1)存储过程if语句的使用方法 delimiter && create procedure zyif( in aa int,out bb int) begin if aa>20 then set bb=30; elseif aa=20 then set bb=20; else set bb=15; end if; end && delimiter ; (2)存储过程case用法 delimiter && create procedure zy_case(in aa int,inout bb int) begin case when aa=20 then set bb=20; when aa>20 and aa<=50 then set bb=30; when aa>51 then set bb=60; else set bb=15; end case; end && delimiter ; (3)while 循环使用,插入1万数据 创建一个表 create table zybb (user_id int, name varchar(10)); Query OK, 0 rows affected (0.10 sec) delimiter && create procedure zy_while() begin declare count int default 0; while count < 100000 do insert into zybb(user_id,name)values(count,‘aaa1‘); set count=count + 1; end while; end && delimiter ; call zy_while() 调用存储过程 #=========================================================== (1)调用存储过程 call+存储过程名称+参数 如:call alvin_name(@p_inout) (2)查询结果 select @p_inout (3)查询存储过程 show procedure status\G; (4)查询某个存储过程详细 show create procedure alvin1\G; (5)查询存储函数 show function status\G; (6)查询某个详细的存储函数 show create function alvin10\G; (7)删除存储过程 drop procedure alvin1; (8)删除存储函数 drop function alvin1;
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。