MySQL存储过程事务
day61
保存在MySQL上的一个别名 > 一坨SQL语句
-- delimiter // -- create procedure p1() -- BEGIN -- select * from student; -- INSERT into teacher(tname) values("ct"); -- END// -- delimiter; call p1(); #把sql语句封装进p1中
注释内容(创建存储过程)执行完,可以通过call调用(执行存储过程)。
在函数中:
也可通过pymysql调用存储过程
1 import pymysql 2 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()
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
#传参数(in,out,inout)delimiter //
create procedure p2(
in n1 int,
in n2 int
)
BEGIN<span style="color: #0000ff;">select</span> <span style="color: #808080;">*</span> <span style="color: #0000ff;">from</span> student <span style="color: #0000ff;">where</span> sid <span style="color: #808080;">></span><span style="color: #000000;"> n1;
END //
delimiter ;
調用方式:
call p2(12,2)
cursor.callproc('p2',(12,2)) #python中
out
delimiter // create procedure p3( in n1 int, inout n2 int ) BEGIN set n2 = 123123; select * from student where sid > n1; END // delimiter ;</span><span style="color: #0000ff;">set</span> <span style="color: #008000;">@v1</span> <span style="color: #808080;">=</span> <span style="color: #800000; font-weight: bold;">0</span><span style="color: #000000;">; call p2(</span><span style="color: #800000; font-weight: bold;">12</span>,<span style="color: #008000;">@v1</span>)</pre>
set @v1 = 0,傳入p2后,n1为12,n2为@v1,@v1为123123,相当传一个引用。
调用call p2(12,@v1)
查看 select @v1;
注意该查询过程需保存,p3才会生效。
在pymysql中
上半部分对应
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 ;
事务:
http://www.cnblogs.com/wupeiqi/articles/5713323.html
支持事务操作
delimiter \\ create PROCEDURE p5( OUT p_return_code tinyint ) BEGIN DECLARE exit handler for sqlexception BEGIN -- ERROR set p_return_code = 1; #出错 rollback; END;DECLARE exit handler for sqlwarning
BEGIN
-- WARNING
set p_return_code = 2;
rollback;
END;START TRANSACTION; #开始事务
DELETE from tb1;
insert into tb2(name)values('seven');
COMMIT;-- SUCCESS
set p_return_code = 2; #未出错END\
delimiter ;
事务操作不会因为数据传输意外中断,而发生错账。
游标:
对表每一行都要进行操作,需要使用游标。
将表A导入B时,加上当前行的id。
delimiter // create procedure p3() begin declare row_id int; -- 自定义变量1 declare row_num int; -- 自定义变量2 declare done INT DEFAULT FALSE;#设初始值</span><span style="color: #0000ff;">DECLARE</span> my_cursor <span style="color: #0000ff;">CURSOR</span> <span style="color: #0000ff;">FOR</span> <span style="color: #0000ff;">select</span> id,num <span style="color: #0000ff;">from</span><span style="color: #000000;"> A;#创建游标 </span><span style="color: #0000ff;">DECLARE</span> <span style="color: #0000ff;">CONTINUE</span> HANDLER <span style="color: #0000ff;">FOR</span> <span style="color: #808080;">NOT</span> FOUND <span style="color: #0000ff;">SET</span> done <span style="color: #808080;">=</span><span style="color: #000000;"> TRUE;#设初始值,循环结束 </span><span style="color: #0000ff;">open</span><span style="color: #000000;"> my_cursor; #开始游标 xxoo: LOOP </span><span style="color: #0000ff;">fetch</span> my_cursor <span style="color: #0000ff;">into</span><span style="color: #000000;"> row_id,row_num; </span><span style="color: #0000ff;">if</span> done <span style="color: #0000ff;">then</span><span style="color: #000000;"> #如果数据取完done 为 TRUE leave xxoo; #离开循环 </span><span style="color: #0000ff;">END</span> <span style="color: #0000ff;">IF</span><span style="color: #000000;">; </span><span style="color: #0000ff;">set</span> <span style="color: #0000ff;">temp</span> <span style="color: #808080;">=</span> row_num <span style="color: #808080;">+</span><span style="color: #000000;"> row_id; #导入B表后还需要加上当前行的id </span><span style="color: #0000ff;">insert</span> <span style="color: #0000ff;">into</span> B(num) <span style="color: #0000ff;">values</span>(<span style="color: #0000ff;">temp</span><span style="color: #000000;">); </span><span style="color: #0000ff;">end</span><span style="color: #000000;"> loop xxoo; </span><span style="color: #0000ff;">close</span><span style="color: #000000;"> my_cursor;#关闭游标
end //
delimter ;
放在服务端,客户端通过p3名字调用。
A
B
删除:
drop procedure proc_name;