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调用存储过程
import pymysql #打开
conn = pymysql.connect(host= "localhost", user = 'root', password='', database = 'db3')
#拿
cursor = conn.cursor()
cursor.callproc('p1')#p1存储过程
result = cursor.fetchall() #拿 print(result)
#关闭数据库
cursor.close()
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 select * from student where sid > 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 ; set @v1 = 0;
call p2(12,@v1)
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;#设初始值 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 ;
放在服务端,客户端通过p3名字调用。
A

B

删除:
drop procedure proc_name;
MySQL(存储过程,支持事务操作)的更多相关文章
- mysql事务的坑----MyISAM表类型不支持事务操作
最近需要通过JDBC对数据库做事务型操作,实践时发现,并没有达到想要的效果,表现在:1.每次执行executeUpdate()后,数据就马上能在DB中查到.但按理来说,我还没执行commit(),DB ...
- MySQL存储过程之事务管理
原文链接:http://hideto.iteye.com/blog/195275 MySQL存储过程之事务管理 ACID:Atomic.Consistent.Isolated.Durable 存储程序 ...
- mysql存储过程之事务篇
mysql存储过程之事务篇 事务的四大特征: ACID:Atomic(原子性).Consistent(一致性).Isolated(独立性).Durable (持久性) MySQL的事务支持不是绑定在M ...
- 4、什么是事务?MySQL如何支持事务?
什么是事务? 事务是由一步或几步数据库操作序列组成逻辑执行单元,这系列操作要么全部执行,要么全部放弃执行.程序和事务是两个不同的概念.一般而言:一段程序中可能包含多个事务.(说白了就是几步的数据库操作 ...
- 什么是事务?MySQL如何支持事务?
什么是事务? 事务是由一步或几步数据库操作序列组成逻辑执行单元,这系列操作要么全部执行,要么全部放弃执行.程序和事务是两个不同的概念.一般而言:一段程序中可能包含多个事务.(说白了就是几步的数据库操作 ...
- 遇过的坑(2)—MyISAM表类型不支持事务操作
最近需要通过JDBC对数据库做事务型操作,实践时发现,并没有达到想要的效果,表现在:1.每次执行executeUpdate()后,数据就马上能在DB中查到.但按理来说,我还没执行commit(),DB ...
- Mysql存储过程包括事务,且传入sql数据运行
有这样一个需求.要求在mysql存储过程中使用到事务,并且运行的是动态的sql语句 代码例如以下: BEGIN DECLARE in_data TEXT; /** 标记是否出错 */ DECLARE ...
- MySql不支持事务解决
用的是一个绿色版的mysql数据库,发现不支持事务,在网络上搜集资料找到解决方案: 1.执行语句 SHOW ENGINES; 如果发现InnoDB全部显示为“YES”,说明该版本的数据库支持事务 2 ...
- mysql 表支持事务的方法
1.在mysql客户管,如:Navicate.SQLyog在导航面板中选择要转换为InnoDB存储引擎类型的数据库,例如选择db_yunping数据库.如下图所示: 2. 在查询窗口中输入 show ...
随机推荐
- 三、oracle 用户管理一
三.oracle 用户管理一 一.创建用户概述:在oracle中要创建一个新的用户使用create user语句,一般是具有dba(数据库管理员)的权限才能使用.create user 用户名 ide ...
- js如何切割字符串
<script language="javascript"> str="2,2,3,5,6,6"; //这是一字符串 var strs= new A ...
- SNP问题大集锦
SNP问题大集锦 [2017-01-19] 最近小编对基因检测很感兴趣,也跟风去测了一下,这一测不要紧,吓得小编几天没睡着觉,这不,检测报告上称小编的减肥能力弱,虽然小编一家都是胖子,唯有 ...
- Spring Boot集成Quartz注入Spring管理的类
摘要: 在Spring Boot中使用Quartz时,在JOB中一般需要引用Spring管理的Bean,通过定义Job Factory实现自动注入. Spring有自己的Schedule定时任务,在S ...
- 项目解析1、登录验证用户是否存在 储备知识 Python 之 decorator装饰器
下面是我对 装饰器 这一小节的总结, 以及自己的理解. 注:[本文中的代码参考上述教程] 很多时候我会把Python的很多语法与C++相融合,在C++中,函数的名称即为函数的地址,我们可以通过定义成为 ...
- 2018.08.30 花园(期望dp)
题目背景 SCOI2017 DAY2 T1 题目描述 小 A 的花园的长和宽分别是 L,H .小 A 喜欢在花园里做游戏.每次做游戏的时候,他都先把花园均匀分割成 L×H 个小方块,每个方块的长和宽都 ...
- hdu-1107(模拟题)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1107 注意:1.路线是要反向的,走不通就反向: 2.输入输出全部是整形 3.攻击力不断变化 #incl ...
- 初探Java反射机制
反射库提供了一个非常丰富且精心设计的工具集,以便编写能够动态操纵java代码的程序库.这项功能被大量地应用于JavaBeans中.反射机制提供了在运行状态中获得和调用修改任何一个类的属性和方法的能力. ...
- java最全的Connection is read-only. Queries leading to data modification are not allowed
Connection is read-only. Queries leading to data modification are not allowed 描述:框架注入时候,配置了事物管理,权限设置 ...
- update 操作用法
--update 这个字段的所值为2 update tab a set a.字段1=2; --带条件的update update tab a set a.字段1=2 where id=10000; - ...