存储过程

#存储过程:mysql5.0以上。将sql以函数的形式存储起来共调用,极大地提高了数据库的处理速度,同时提高了数据库编程的灵活性。

#定界符,防止被mysql当成sql语句处理
DELIMITER //
	create procedure demo()#函数名
	begin	#过程体的开始与结束使用begin与end进行标识
		select * from 表名
	end	
// DELIMITER ;

#用户变量:::凡是带有@的都属于用户变量,使用用户变量要先set @user = '';,否则null;查询用户变量select @user;注意,滥用用户变量易导致程序难以理解或管理。
#注释:::--单行;/****/多行注释;
#过程函数参数:::IN/OUT/INOUT 参数名 类型(为mysql字段类型)

DELIMITER //
 create procedure demo()
		BEGIN
			select * from sp_user;
		END
		// 
DELIMITER;		

#调用
CALL demo();

#获取数据的全部存储过程
select * from information_schema.ROUTINES;
select * from information_schema.ROUTINES where specific_name = 'in_param';

#in
DELIMITER //
  CREATE PROCEDURE in_param(IN p_in int)
    BEGIN
    SELECT p_in;
    SET p_in=2;
    SELECT p_in;
    END;
    //
DELIMITER ;
drop procedure in_param;
#调用
SET @p_in=1;
CALL in_param(@p_in);
SELECT @p_in;

#out
DELIMITER //
	CREATE PROCEDURE out_param(OUT p_out int)
		BEGIN
		SELECT p_out;
		set p_out=2;
		select p_out;
		END
// DELIMITER;		
#调用
SET @p_out=1;
CALL out_param(@p_out);
SELECT @p_out;

#inout
DELIMITER //
	CREATE PROCEDURE inout_param(INOUT p_inout int)
		BEGIN
			SELECT p_inout;
			SET p_inout=2;
			SELECT p_inout;
		END
	// 
DELIMITER;		
drop PROCEDURE inout_param;
#调用
SET @p_inout=1;
CALL inout_param(@p_inout) ;
SELECT @p_inout;

SELECT 'Hello World' into @x;
SELECT @x;
SET @y='Goodbye Cruel World';
SELECT @y;
SET @z=1+2+3;
SELECT @z;



#IN/OUT/INPUT参数
#试例1,简单调用(OUT)。实现调用存储过程时,传入 user_id 返回改用户的user_name
drop PROCEDURE out_demo;
DELIMITER //
 create procedure out_demo(IN my_user_id varchar(32),OUT user_name varchar(32))
		BEGIN
			select name into user_name from Watcher where id = my_user_id;
			select user_name;
		END
		// 
DELIMITER;	
#试例1调用方法:
CALL shoufuyou_statistics.out_demo('5',@user_name);

#试例2,简单调用(IN)。实现调用存储过程时,传入 user_id 返回改用户的user_name
drop PROCEDURE in_demo;
DELIMITER //
 create procedure in_demo(IN my_user_id varchar(32))
		BEGIN
			declare user_name varchar(32) default '';#因参数中不含有此变量,故须要声明declare
			select name into user_name from Watcher where id = my_user_id;
			select user_name;
		END
		// 
DELIMITER;	
#试例2调用方法:
CALL shoufuyou_statistics.in_demo('5');

#试例3,简单调用(INOUT)。实现调用存储过程时,传入 user_id 返回改用户的user_name
drop PROCEDURE inout_demo;
DELIMITER //
 create procedure inout_demo(INOUT my_user_id varchar(32),INOUT user_name varchar(32))
		BEGIN
			set my_user_id = '5';
			set user_name = '易君强';
			select id,name into my_user_id,user_name from Watcher where id = my_user_id;
			select my_user_id,user_name;
		END
		// 
DELIMITER;	
#试例3调用方法:
call inout_demo(@my_user_id,@user_name);#正确
call inout_demo('6',@user_name);#错误



###变量作用域  由上自下
DELIMITER //  
	CREATE PROCEDURE default_demo()  
		begin 
			declare x1 varchar(5) default 'outer';  
		begin 
		declare x1 varchar(5) default 'inner';  
			select x1;  
		end;  
			select x1;  
		end;  
	//  
DELIMITER ;  
call default_demo();

###条件语句  
#1.if-then-else
delimiter $$
	create procedure if_demo(IN parameter int)  
		begin 
			declare var int;
			set var = parameter * 1;
			if var = 2 then 
				insert into demo value(3,17);#向表demo中添加信息,注意表的字段数量
			end if;
			if parameter = 0 then 
				update demo set user_email = user_email + 1;#修改表demo的字段user_email值为自身+1
			else 
				update demo set user_email = user_email + 2;#修改表demo的字段user_email值为自身+2
			end if;
		end;
		$$
delimiter;		
call if_demo(2);#调用

#2.case语句
DELIMITER //  
	CREATE PROCEDURE case_demo (in parameter int)  
		begin 
			declare var int;  
			set var = parameter + 1;  
		case var  
		when 0 then   
			insert into demo (user_email)values(17);  
		when 1 then   
			insert into demo (user_email)values(18);  
		else   
			insert into demo (user_email)values(19);  
		end case;  
	end;  
	//  
DELIMITER ; 
call case_demo(-1);

###循环语句
#1.while...end while	特点是执行操作前检查结果
DELIMITER //  
	CREATE PROCEDURE while_demo()  
		begin 
			declare var int;  
			set var = 0;  
			while var < 6 do  
				insert into demo (user_email)values(var);  
			set var = var + 1;  
		end while;  
	end;  
	//  
DELIMITER ; 
call while_demo();

#2.repeat···· end repeat  特点是执行操作后检查结果,与do..while类似
DELIMITER //  
	CREATE PROCEDURE repeat_demo()  
		begin   
			declare v int;  
			set v = 0;  
			repeat  
				insert into demo (user_email)values(v);  
				set v = v + 1;  
				until v >= 5  
			end repeat;  
		end;  
	//  
DELIMITER ;  
call repeat_demo();

#3.LOOP...END LOOP
DELIMITER //
drop function if exists loop_demo;
  CREATE PROCEDURE loop_demo()
    begin
      declare v int;
      set v = 0;
      LOOP_LABLE:LOOP
        insert into demo (user_email)VALUES(v);
        set v = v + 1;
        if v >= 5 then
          LEAVE LOOP_LABLE;#类似于break,满足条件就跳出
        end if;
      END LOOP;
    end;
  //
DELIMITER ;
call loop_demo();

#3.LOOP...END LOOP--demo---在MySQL中用函数实现在字符串一后面循环拼接n个字符串二
delimiter $$
drop function if exists fun_addStr;
create function fun_addStr(str1 varchar(100),str2 varchar(10),num int) returns varchar(200)
begin
    declare i int default 1;
    declare result varchar(200) default '';
    set result = str1;
    myloop:loop
        set i = i + 1;
        set result = concat(result,str2);
        if i > num then
					leave myloop;
        end if;
    end loop myloop; 
    return result;
end $$
delimiter;
select fun_addStr('字符串一','字符串二',3);

#迭代
#ITERATE	通过引用复合语句的标号,来从新开始复合语句
DELIMITER //
  CREATE PROCEDURE iterate_demo()
  begin
    declare v int;
    set v = 0;
    LOOP_LABLE:LOOP
      if v = 3 then
        set v = v + 1;
        ITERATE LOOP_LABLE;
      end if;
      insert into demo (user_email)VALUES(v);
      set v = v + 1;
      if v >= 5 then
        LEAVE LOOP_LABLE;
      end if;
    END LOOP;
  end;
  //
DELIMITER ;
call iterate_demo();

  例子,通过存储过程向数据表中添加指定数量信息。

delimiter ;;
create procedure idata()
begin
  declare i int;
  set i=1;
  while(i<=100000)do
    insert into t values(i, i, i);
    set i=i+1;
  end while;
end;;
delimiter ;
call idata();
原文地址:https://www.cnblogs.com/two-bees/p/10450468.html