存储过程:是一个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

 

查看原文