MySQL存储过程总结

存储过程

  • 概念:事先经过编译并存储在数据库的一段SQL语句集合

  • 创建存储过程

    delimiter $	#声明分隔符为$,因为sql语句中可能会有分隔符;,而;出现会导致SQL认为编辑结束,就会执行
    create procedure procedure_name([proc_parameter[...]])
    begin
    	sql语句
    end$
    
  • 调用储存过程

    call procedure_name()
    
  • 查看存储过程

    #第一种方式
    select 'name' from mysql.proc where db='db_name';
    
    #第二种方式
    show procedure status\G;
    
    #查看存储过程的定义
    show procedure procedure_name;
    
    
  • 删除存储过程

    drop procedure procedure_name;
    

语法

  • 存储过程是可以编程的,意味着可以使用变量,表达式,控制结构来完成比较复杂的功能

  • 变量declare var_name type [default value],该变量只能作用在begin…end块中

  • 赋值

    #第一种
      set var_name=xxx
     #第二种
     select xxx into var_name from tb_name;#从表中选择xxx赋值给var_name
    
  • if 条件判断

    if serch_condition then
    	statement_list
    [elseif serch_condition then
    	statement_list]
    [else serch_condition then
    	statement_list]
    
    #举例
    delimiter $
    create procedure procedure_test01()
    begin
    	declare height int default 175;
    	declare description varchar(50) default '';
    	if height >=180 then
    		set description = '身材高挑';
    	elseif height >= 170 and height <180 then
    		set description = '身材良好';
    	else 
    		set description = '一般身材';
    	select concat('身高',height,'对应的身材类型',description);
    	end if;
    end$
    
    #调用
    call procedure_test01()$
    
  • 传递参数create procedure procedure_name([in/out/inout] 参数名 参数类型)

    #in
    delimiter $
    create procedure procedure_test02(in height int)
    begin
    	#declare height int default 175;
    	declare description varchar(50) default '';
    	if height >=180 then
    		set description = '身材高挑';
    	elseif height >= 170 and height <180 then
    		set description = '身材良好';
    	else 
    		set description = '一般身材';
    	select concat('身高',height,'对应的身材类型',description);
    	end if;
    end$
    
    #调用
    call procedure_test02(190)$
    

    out

    delimiter $
    create procedure procedure_test03(in height int,out description varchar[(20)])#[]代表可选项,可写可不写
    begin
    	#declare height int default 175;
    	#declare description varchar(50) default '';
    	if height >=180 then
    		set description = '身材高挑';
    	elseif height >= 170 and height <180 then
    		set description = '身材良好';
    	else 
    		set description = '一般身材';
    	#select concat('身高',height,'对应的身材类型',description);
    end if;
    end$
    
    #调用
    call procedure_test03(171,@description)$ #@代表是用户会话变量,类似于全局变量
    select @description
    

    case

    create procedure procedure_test04(in mon int)
    begin
    	declare resault varchar(10);
    	case
    		when mon>=1 and mon<=3 then
    			set resault = '第一季度';
    		when mon>=4 and mon<=6 then
    			set resault = '第二季度';
    		when mon>=7 and mon<=9 then
    			set resault = '第三季度';
    		when mon>=10 and mon<=12 then
    			set resault = '第四季度';
    	end case;
    	select concat('查询结果为:',resault) as context; #起个别名contexxxt
    end$
    
    #调用
    call procedure_test04(4)
    
  • while循环

    #计算从1加到n的值--累加
    create procedure procedure_test05(n int)
    begin
    	declare total int default 0;
    	declare num int default 1;
    	while num <= n do
    		set total = total +num;
    		set num = num+1;
    	end while;
    	select total;
    end$
    
  • repeat结构

    repeat
    	statement
    	until serch_condition
    end repeat;
    
    
    示例
    create procedure procedure_test06(n int)
    begin
    	declare total int default 0;
    	
    	repeat 
    		set total = total +n;
    		set n = n-1;
    		until n=0
    		
    	end repeat;
    	select total;
    end$
    
  • loop 与 leave 结构

    create procedure procedure_test07(n int)
    begin
    	declare total int default 0;
    	
    	c:loop #c为给loop起的别名
    		set total = total +n;
    		set n = n-1;
    		if n<=0 then
    			leave c;
    		end if;
    		
    	end loop c;
    	select total;
    end$
    
  • 游标

    #声明光标
    declare cursor_name cursor for select_statement;
    
    #open 光标
    open cursor_name;
    
    fetch 光标
    fetch cursor_name into var_name[,var_char,..];
    
    close 光标
    close cursor_name;
    
    
    #示例
    create procedure procedure_test08()
    	begin
    		declare e_id int(10),
    		declare e_name varchar(30),
    		declare e_age int(10),
    		declare e_salary int(8),
    		declare cursor_test01 cursor from select * from emp; #emp为表
    		open cursor_test;
    		fetch cursor_test into e_id,e_name,e_age,e_salary; #注意:有多少条记录就fetch多少次
    		#如果fetch的条数小于查询到的记录数,那么在下面的select中只会先择相应的fetch条数
    		#如果fetch条数大于查询到的记录数,那么显示完相应的fetch条数后,在下面的select中会报错
    		close cursor_test;
    		select concat('id'=e_id,'name'=e_name,'age'=e_age,'salary'=e_salary);
    	end$
    #上面列子由于不知道查询的结果数,所以改进一下
    create procedure procedure_test08()
    	begin
    		declare e_id int(10),
    		declare e_name varchar(30),
    		declare e_age int(10),
    		declare e_salary int(8),
    		declare has_data int default 1
    		
    		declare cursor_test01 cursor from select * from emp; #emp为表
    		DECLARE EXIT HANDLE FOR NOT FOUND set has_data = 0;#必须写在声明游标之后
    		
    		
    		
    		open cursor_test01;
    		
    		repeat
    			fetch cursor_test01 into e_id,e_name,e_age,e_salary; 
    			select concat('id'=e_id,'name'=e_name,'age'=e_age,'salary'=e_salary);
    			until has_data = 0
    		end repeat;
    		
    		close cursor_test01;
    		
    	end$
    

存储函数

  • 语法结构

    create function function_name([param type...]);
    RETURNS type
    begin
    	...
    end$
    
  • 实例:定义一个函数,满足查询(city表)的总记录条数

    create function function_test01(countryId int_);
    RETURNS	int
    begin
    	declare cnum int;
    	select count(*) into cnum from city where country_id=countryId;
    	return cnum
    end$
    
    #调用
    select function_test01(3)
    
  • 删除函数

    drop function function_name
    
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: MySQL 存储过程的写法如下所示: CREATE PROCEDURE procedure_name (IN param1 datatype1, IN param2 datatype2, ..., OUT result_name datatype) BEGIN -- 写入存储过程的处理逻辑 -- 可以使用 IF、CASE、LOOP、WHILE 等语句 -- 最后将结果存储到 result_name 中 END; 其中,procedure_name 为存储过程的名称,param1、param2 等为存储过程的输入参数,result_name 为存储过程的输出参数。在 BEGIN 和 END 之间编写存储过程的处理逻辑,最后将结果存储到输出参数中,以便后续使用。 ### 回答2: MySQL存储过程是一组预先编译好的SQL语句。它们被存储在数据库中,并可以通过调用来执行。MySQL存储过程的写法如下: 1. 创建存储过程: 使用 `CREATE PROCEDURE` 语句创建存储过程。例如,如果要创建一个名为 `myprocedure` 的存储过程,可以使用以下语法: ``` CREATE PROCEDURE myprocedure() BEGIN -- 写入存储过程SQL语句 -- ... END; ``` 2. 存储过程参数: 存储过程可以接受输入参数和输出参数,以便传递数据。以下是定义存储过程参数的语法: ``` CREATE PROCEDURE myprocedure(IN input_param INT, OUT output_param INT) BEGIN -- 使用 input_param 和 output_param 进行操作 -- ... END; ``` 在存储过程中使用 `IN` 关键字定义输入参数,并使用 `OUT` 关键字定义输出参数。 3. 存储过程内容: 在 `BEGIN` 和 `END` 关键字之间,可以编写一系列SQL语句来定义存储过程的功能。这些语句可以包含条件、循环、查询和其他SQL操作。 例如,以下存储过程通过将两个参数相加,并将结果存储到输出参数中: ``` CREATE PROCEDURE myprocedure(IN a INT, IN b INT, OUT result INT) BEGIN SET result = a + b; END; ``` 4. 调用存储过程: 要调用存储过程,可以使用 `CALL` 语句,后跟存储过程的名称和参数列表。例如,调用上面创建的存储过程可以使用以下语法: ``` CALL myprocedure(3, 4, @output); ``` 在这个例子中,存储过程的输入参数分别为3和4,结果存储在 `@output` 变量中。 以上是MySQL存储过程的一般写法。存储过程为我们提供了一种方便的方式来存储和执行复杂的数据库操作,提高了数据库的可维护性和可重用性。 ### 回答3: MySQL存储过程是一组预先编译的SQL语句,通过调用存储过程来执行这些SQL语句。MySQL存储过程具有以下写法: 1. 创建存储过程: 使用CREATE PROCEDURE语句创建存储过程,语法如下: CREATE PROCEDURE procedure_name ([parameter_list]) [characteristics] stored_procedure_body 其中,procedure_name是存储过程的名称,parameter_list是存储过程的参数列表,characteristics是字符集、安全性等特性,stored_procedure_body是存储过程的具体实现代码。 2. 删除存储过程: 使用DROP PROCEDURE语句删除存储过程,语法如下: DROP PROCEDURE [IF EXISTS] procedure_name 其中,procedure_name是要删除的存储过程的名称。IF EXISTS是可选的,表示当存储过程不存在时不会产生错误。 3. 编辑存储过程: 使用ALTER PROCEDURE语句编辑存储过程,语法如下: ALTER PROCEDURE procedure_name ([parameter_list]) [characteristics] stored_procedure_body 其中,procedure_name是要编辑的存储过程的名称,parameter_list是存储过程的参数列表,characteristics是字符集、安全性等特性,stored_procedure_body是存储过程的新实现代码。 4. 执行存储过程: 使用CALL语句执行存储过程,语法如下: CALL procedure_name([parameters]) 其中,procedure_name是要执行的存储过程的名称,parameters是存储过程的参数列表。 总结来说,MySQL存储过程的写法包括创建、删除、编辑和执行四个步骤。创建存储过程使用CREATE PROCEDURE语句,删除存储过程使用DROP PROCEDURE语句,编辑存储过程使用ALTER PROCEDURE语句,执行存储过程使用CALL语句。同时,存储过程可以带有参数,通过参数列表进行传递。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值