MySQL stored procedures learn to organize, use cursors, parameter input and output

MySQL stored procedures learn to organize, use cursors, parameter input and output

1. What is a stored procedure
1. It can be understood as a sql statement set, which can execute multiple sql at the same time to realize more complex logic.
2. Regarding the stored procedure, it is better to talk about it here, please refer to: https://www.cnblogs.com/chenpi/p/5136483.html

2. Simple stored procedure
1. Syntax:
CREATE PROCEDURE pro_now() -- stored procedure name, custom
BEGIN -- start a stored procedure
            # The set of sql statements that need to be executed, and CRUD operations can be performed on the data table
            -- insert some sql here
end; -- end the stored procedure

2. Create a stored procedure that queries the current time:
CREATE  PROCEDURE pro_now()
BEGIN
    SELECT now();
end;

      3. Call the stored procedure: call pro_now(); -- call keyword, "pro_now()" stored procedure name
4. View the created stored procedure: show PROCEDURE STATUS [ where name='pro_now'] ;

5. Delete the stored procedure: DROP PROCEDURE pro_now; -- "pro_now" stored procedure name

Third, create a stored procedure with parameters
1. Stored procedures with input parameters, using keywords: in
    a、示例如下:
        
CREATE PROCEDURE pro_now_in(in time  VARCHAR(20) CHARACTER set "utf8")	
        -- CHARACTER set "utf8",设定字符集,解决中文乱码
BEGIN
	 SELECT now(),time;
end;

b、调用存储过程:
set @time='当前时间';
call pro_now_in(@time); --  call pro_now_in('当前时间'); 这样也可以

c、结果如下:


2、带输出参数的存储过程,使用关键字: out
a、示例如下:
CREATE PROCEDURE pro_now_out(out time  VARCHAR(20),out title VARCHAR(20) CHARACTER set utf8)
BEGIN
	 SELECT now(),'当前时间' into time , title;
end;

b、调用存储过程:
call pro_now_out(@times,@title);
SELECT @title AS "标题",@times AS "时间";



c、结果如下:

3、带输入、输出参数的存储过程,使用关键字: inout
a、示例如下:
CREATE PROCEDURE pro_now_inout(inout name VARCHAR(20),in title VARCHAR(10), out time VARCHAR(10))
BEGIN
	 SELECT CONCAT(name,'<--->',title) AS name,now() into name,time;
end;



b、调用存储过程
set @name='jack';
set @title='toady';
call pro_now_inout(@name,@title,@time);
select @name as 'name and title',@time as 'time';

            c、结果如下:    



d、理解:
  • in (输入): name 、title
  • out (输出): name 、 time
  • CONCAT(name,'<--->',title) 对应 name 输出、 now() 对应 time 输出

四、创建带流程控制语句的存储过程
1、if 语句
a、示例如下:
CREATE PROCEDURE pro_if(in num INT)
     BEGIN
	    DECLARE result VARCHAR(20) CHARACTER set  utf8 DEFAULT null;
	    IF num = 0 THEN  -- 开始if判断,注意用一个等号"="
	        set result='num 为0啦'; -- 满足条件
	    ELSEIF num > 0 THEN -- 下一个if判断
		set result='num 大于 0';
  	    ELSEIF num < 0 THEN
		set result='num 小于 0';
	    ELSE -- 所有条件不满足的情况下
		set result='num is null or other status';
	    end if; -- 结束if 判断 
	    SELECT result;
 end;



b、调用存储过程:
call pro_if('33');

             c、结果如下:


2、case 语句
a、示例如下:
CREATE PROCEDURE pro_case(in num INT)
BEGIN
	DECLARE result VARCHAR(20) CHARACTER set  utf8 DEFAULT null;
	case num  -- 开始case 判断
	when  2 THEN  -- 满足条件执行
		set result='num 值是2';
 	 when -2 THEN  
		set result='num 值是-2';
	else  -- 所有条件不满足,执行
		set result='num 不等于2和-2';
	end case ; -- 结束case语句
	SELECT result;
end;


b、调用存储过程
call pro_case(-2);

c、结果如下:

3、while 循环语句
a、示例如下:
CREATE PROCEDURE pro_while(in num INT)
BEGIN
	DECLARE i int;
	DECLARE result int;
	set i=0;
	set result=0;
	while i < num DO -- 开始while 循环
		set result=result+i;
		set i=i+1;
	end while; -- 结束while 循环 
	SELECT result,i;
end;

             b、调用存储过程:
call pro_while(100);

c、结果如下:


五、创建带游标循环的存储过程
1、示例如下:
        
CREATE PROCEDURE pro_cursor(out count int)
BEGIN
	declare  paper_id  VARCHAR(1000) ; -- 论文主键id
	declare doctroName VARCHAR(1000) character set gbk; -- 医生名称
	DECLARE paper_hos VARCHAR(1000); -- 医院id
	DECLARE paper_room      VARCHAR(100); -- 医生专业
	declare done int DEFAULT false ; -- 自定义控制游标循环变量,默认false
	DECLARE  my_cursor CURSOR for (SELECT id,authorName,hospitalId,room
							from yee_article_paper_authorid ); -- 定义游标并输入结果集  
	DECLARE CONTINUE HANDLER FOR NOT FOUND SET done=TRUE; -- 绑定控制变量到游标,游标循环结束自动转true 
	OPEN my_cursor; -- 打开游标
	myLoop:LOOP -- 开始循环体,myLoop为自定义循环名,结束循环时用到  
	FETCH my_cursor into paper_id,doctroName,paper_hos,paper_room ;  -- 将游标当前读取行的数据顺序赋予自定义变量12  
	if done THEN -- 判断是否继续循环  
		LEAVE myLoop;-- 结束循环
	END IF;
	 -- 自己要做的事情,在 sql 中直接使用自定义变量即可  
	insert into temp(str_id,name,hospitalId,room) 	
VALUES(paper_id,doctroName,paper_hos,paper_room);
	COMMIT; -- 提交事务
  END  LOOP myLoop; -- 结束 自定义循环体
	CLOSE my_cursor; -- 关闭游标
	# 循环结束后,统计导入个数
	SELECT count(id)  count from temp into count; -- 计算个数
end




Guess you like

Origin http://43.154.161.224:23101/article/api/json?id=325858820&siteId=291194637