mysql 存储 事务_MySQL存储过程事务

day61

保存在MySQL上的一个别名   >   一坨SQL语句

48304ba5e6f9fe08f3fa1abda7d326ab.png

--delimiter //--create procedure p1()--BEGIN--select * from student;--INSERT into teacher(tname) values("ct");--END//--delimiter;

call p1(); #把sql语句封装进p1中

48304ba5e6f9fe08f3fa1abda7d326ab.png

注释内容(创建存储过程)执行完,可以通过call调用(执行存储过程)。

在函数中:

764bc7492ccb45a14a64ac2b22bd523b.png

也可通过pymysql调用存储过程

48304ba5e6f9fe08f3fa1abda7d326ab.png

1 importpymysql2

3 #打开

4 conn = pymysql.connect(host= "localhost", user = 'root', password='112358', database = 'db3')5 #拿

6 cursor =conn.cursor()7 cursor.callproc('p1')#p1存储过程

8 result = cursor.fetchall() #拿

9

10 print(result)11 #关闭数据库

12 cursor.close()13 conn.close()

48304ba5e6f9fe08f3fa1abda7d326ab.png

cursor.callproc('p1')

执行结果:

((1, '男', 1, '理解'), (2, '女', 1, '钢蛋'), (3, '男', 1, '张三'), (4, '男', 1, '张一'), (5, '女', 1, '张二'), (6, '男', 1, '张四'), (7, '女', 2, '铁锤'), (8, '男', 2, '李三'), (9, '男', 2, '李一'), (10, '女', 2, '李二'), (11, '男', 2, '李四'), (12, '女', 3, '如花'), (13, '男', 3, '刘三'), (14, '男', 3, '刘一'), (15, '女', 3, '刘二'), (16, '男', 3, '刘四'), (18, '女', 1, '触发'), (19, '女', 1, '触发'), (20, '女', 1, '触发'), (21, '女', 1, '啦啦'))

Process finished with exit code 0

传参查询

in

48304ba5e6f9fe08f3fa1abda7d326ab.png

#传参数(in,out,inout)

delimiter //

create procedurep2(in n1 int,in n2 int)BEGIN

select * from student where sid > n1;

END //delimiter ;

48304ba5e6f9fe08f3fa1abda7d326ab.png

調用方式:

call p2(12,2)

cursor.callproc('p2',(12,2))  #python中

out

48304ba5e6f9fe08f3fa1abda7d326ab.png

delimiter //

create procedurep3(in n1 int,

inout n2int)BEGIN

set n2 = 123123;select * from student where sid >n1;END //delimiter ;

set @v1 = 0;

call p2(12,@v1)

48304ba5e6f9fe08f3fa1abda7d326ab.png

set @v1 = 0,傳入p2后,n1为12,n2为@v1,@v1为123123,相当传一个引用。

调用call p2(12,@v1)

查看 select @v1;

7eac01e0c7d6599c1ac64227ec30cdb9.png

注意该查询过程需保存,p3才会生效。

在pymysql中

1b1aa821655f4923b23cdead94445346.png

上半部分对应

set @v1 = 10;

call p2(12,@v1)

下半部分对应

select @v1;

其中@__p3_0,@__p3__1对应n1,n2。

存储过程在服务端,客户端可以调用。

事务

delimiter //

create procedure p4(

out status int

)

BEGIN

1. 声明如果出现异常则执行{

set status = 1;    #出现错误

rollback;             #回滚

}

开始事务

-- 由秦兵账户减去100

-- 方少伟账户加90

-- 张根账户加10

commit;        #提交

结束

set status = 2;          #说明没出错

END //

delimiter ;

事务:

支持事务操作

48304ba5e6f9fe08f3fa1abda7d326ab.png

delimiter \\create PROCEDUREp5(

OUT p_return_codetinyint)BEGIN

DECLARE exit handler forsqlexceptionBEGIN

--ERROR

set p_return_code = 1; #出错rollback;END;

DECLARE exit handler forsqlwarningBEGIN

--WARNING

set p_return_code = 2;rollback;END;

START TRANSACTION; #开始事务DELETE fromtb1;insert into tb2(name)values('seven');COMMIT;

--SUCCESS

set p_return_code = 2; #未出错

END\

delimiter ;

48304ba5e6f9fe08f3fa1abda7d326ab.png

事务操作不会因为数据传输意外中断,而发生错账。

游标:

对表每一行都要进行操作,需要使用游标。

5ba2a578edd094e69d9e17b9bbd8ff8d.png

将表A导入B时,加上当前行的id。

48304ba5e6f9fe08f3fa1abda7d326ab.png

delimiter //

create procedurep3()begin

declare row_id int; --自定义变量1

declare row_num int; --自定义变量2

declare done INT DEFAULTFALSE;#设初始值

DECLARE my_cursor CURSOR FOR select id,num from A;#创建游标

DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;#设初始值,循环结束

open my_cursor; #开始游标

xxoo: LOOP

fetch my_cursor into row_id,row_num;

if done then #如果数据取完done 为 TRUE

leave xxoo; #离开循环

END IF;

set temp = row_num + row_id; #导入B表后还需要加上当前行的id

insert into B(num) values(temp);

end loop xxoo;

close my_cursor;#关闭游标

end //delimter ;

48304ba5e6f9fe08f3fa1abda7d326ab.png

放在服务端,客户端通过p3名字调用。

A

48e9cd4fb3cc8adb610496886bc30b27.png

B

d82a9cf549f0009c4cdf9d8a9d88f6fb.png

删除:

drop procedure proc_name;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值