存储过程:是一个SQL语句集合,当主动去调用存储过程时,其中内部的SQL语句会按照逻辑执行。

1.创建存储过程:

-- 创建存储过程
delimiter //
create procedure p1()
BEGIN
    select * from t1;
END//
delimiter ;

-- 执行存储过程
call p1()

存储过程参数:

in:仅用于传入参数用

out:仅用于返回值用

inout:既可以传入又可以当作返回值

1 -- 创建存储过程
 2 delimiter \\
 3 create procedure p1(
 4     in i1 int,
 5     in i2 int,
 6     inout i3 int,
 7     out r1 int
 8 )
 9 BEGIN
10     DECLARE temp1 int;
11     DECLARE temp2 int default 0;
12     
13     set temp1 = 1;
14 
15     set r1 = i1 + i2 + temp1 + temp2;
16     
17     set i3 = i3 + 100;
18 
19 end\\
20 delimiter ;
21 
22 -- 执行存储过程
23 set @t1 =4;
24 set @t2 = 0;
25 CALL p1 (1, 2 ,@t1, @t2);
26 SELECT @t1,@t2;

示例:有参存储过程

1 delimiter //
2 create procedure p1()
3 begin
4 select * from v1;
5 end //
6 delimiter ;

示例:结果集

1 delimiter //
 2 create procedure p2(
 3 in n1  int,
 4 inout n3 int,
 5 out n2 int,
 6 )
 7 begin
 8     declare temp1 int;
 9     declare temp2 int default 0;
10     select * from v1;
11     set n2 = n1 + 100;
12     set n3 = n3 + n1 + 100;
13 end //
14 delimiter;

示例:结果集+Out

1 delimiter \ \
 2 create PROCEDURE p1(OUT p_return_code tinyint)
 3 BEGIN
 4     DECLARE exit handler for sqlexception
 5     BEGIN
 6         --执行失败
 7         set p_return_code = 1;
 8         rollback;
 9     END;
10     DECLARE exit handler for sqlwarning
11     BEGIN
12         --警示
13         set p_return_code = 2;
14         rollback;
15     END;
16 
17     START TRANSACTION;
18     DELETE from tb1;
19     insert into tb2(name) values('seven');
20     COMMIT;
21     -- SUCCESS
22     set p_return_code = 0;
23 END\ \
24 delimiter;

示例:事务

1                     delimiter //
 2                     create procedure p3()
 3                     begin 
 4                         declare ssid int; -- 自定义变量1  
 5                         declare ssname varchar(50); -- 自定义变量2  
 6                         DECLARE done INT DEFAULT FALSE;
 7 
 8 
 9                         DECLARE my_cursor CURSOR FOR select sid,sname from student;
10                         DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;
11                         
12                         open my_cursor;
13                             xxoo: LOOP
14                                 fetch my_cursor into ssid,ssname;
15                                 if done then 
16                                     leave xxoo;
17                                 END IF;
18                                 insert into teacher(tname) values(ssname);
19                             end loop xxoo;
20                         close my_cursor;
21                     end  //
22                     delimter ;

示例:游标

1                     delimiter \\
 2                     CREATE PROCEDURE p4 (
 3                         in nid int
 4                     )
 5                     BEGIN
 6                         PREPARE prod FROM 'select * from student where sid > ?';
 7                         EXECUTE prod USING @nid;
 8                         DEALLOCATE prepare prod; 
 9                     END\\
10                     delimiter ;

示例:动态执行SQL

2.删除存储过程:

drop procedure proc_name;

3.执行存储过程

-- 无参数
call proc_name()

-- 有参数,全in
call proc_name(1,2)

-- 有参数,有in,out,inout
set @t1=0;
set @t2=3;
call proc_name(1,2,@t1,@t2)


1 #!/usr/bin/env python
 2 # -*- coding:utf-8 -*-
 3 import pymysql
 4 conn = pymysql.connect(host='127.0.0.1', port=3306, user='root', passwd='123', db='t1')
 5 cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)
 6 # 执行存储过程
 7 cursor.callproc('p1', args=(1, 22, 3, 4))
 8 # 获取执行完存储的参数
 9 cursor.execute("select @_p1_0,@_p1_1,@_p1_2,@_p1_3")
10 result = cursor.fetchall()
11 conn.commit()
12 cursor.close()
13 conn.close()
14 print(result)

PyMysql