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(存储过程,支持事务操作)的更多相关文章

  1. mysql事务的坑----MyISAM表类型不支持事务操作

    最近需要通过JDBC对数据库做事务型操作,实践时发现,并没有达到想要的效果,表现在:1.每次执行executeUpdate()后,数据就马上能在DB中查到.但按理来说,我还没执行commit(),DB ...

  2. MySQL存储过程之事务管理

    原文链接:http://hideto.iteye.com/blog/195275 MySQL存储过程之事务管理 ACID:Atomic.Consistent.Isolated.Durable 存储程序 ...

  3. mysql存储过程之事务篇

    mysql存储过程之事务篇 事务的四大特征: ACID:Atomic(原子性).Consistent(一致性).Isolated(独立性).Durable (持久性) MySQL的事务支持不是绑定在M ...

  4. 4、什么是事务?MySQL如何支持事务?

    什么是事务? 事务是由一步或几步数据库操作序列组成逻辑执行单元,这系列操作要么全部执行,要么全部放弃执行.程序和事务是两个不同的概念.一般而言:一段程序中可能包含多个事务.(说白了就是几步的数据库操作 ...

  5. 什么是事务?MySQL如何支持事务?

    什么是事务? 事务是由一步或几步数据库操作序列组成逻辑执行单元,这系列操作要么全部执行,要么全部放弃执行.程序和事务是两个不同的概念.一般而言:一段程序中可能包含多个事务.(说白了就是几步的数据库操作 ...

  6. 遇过的坑(2)—MyISAM表类型不支持事务操作

    最近需要通过JDBC对数据库做事务型操作,实践时发现,并没有达到想要的效果,表现在:1.每次执行executeUpdate()后,数据就马上能在DB中查到.但按理来说,我还没执行commit(),DB ...

  7. Mysql存储过程包括事务,且传入sql数据运行

    有这样一个需求.要求在mysql存储过程中使用到事务,并且运行的是动态的sql语句 代码例如以下: BEGIN DECLARE in_data TEXT; /** 标记是否出错 */ DECLARE ...

  8. MySql不支持事务解决

    用的是一个绿色版的mysql数据库,发现不支持事务,在网络上搜集资料找到解决方案: 1.执行语句  SHOW ENGINES; 如果发现InnoDB全部显示为“YES”,说明该版本的数据库支持事务 2 ...

  9. mysql 表支持事务的方法

    1.在mysql客户管,如:Navicate.SQLyog在导航面板中选择要转换为InnoDB存储引擎类型的数据库,例如选择db_yunping数据库.如下图所示: 2. 在查询窗口中输入 show ...

随机推荐

  1. MetroApp保存UIEment为图片

    写本文的起因是想截取Metro App画面作为图片来使用Win8的共享. 话说自从大MS的客户端UI技术进入XAML时代之后,每次截屏的代码都不太一样,无论silverlight.WPF还是Windo ...

  2. 2018.09.14 codechef Milestone(随机化算法)

    传送门 由于存在不超过7条直线可以覆盖超过所有的点. 所以如果我们随机选点的话(每次随机两个) 那么得到的解恰好为最优解的概率是149" role="presentation&qu ...

  3. org.apache.cxf 官方骨架

    mvn archetype:generate -DarchetypeCatalog=remote 用 cxf 筛选结果 官方三大项目骨架 org.apache.cxf:cxf-http-basic ( ...

  4. NSData与UIImage之间的转换

    1 //NSData转换为UIImage 2 NSData *imageData = [NSData dataWithContentsOfFile: imagePath]; 3 UIImage *im ...

  5. (KMP)Simpsons’ Hidden Talents -- hdu -- 2594

    http://acm.hdu.edu.cn/showproblem.php?pid=2594 Simpsons’ Hidden Talents Time Limit: 2000/1000 MS (Ja ...

  6. Hdu1342 Lotto 2017-01-18 17:12 44人阅读 评论(0) 收藏

    Lotto Time Limit : 2000/1000ms (Java/Other)   Memory Limit : 65536/32768K (Java/Other) Total Submiss ...

  7. CG图形学的工具

    1. http://give.zju.edu.cn/cgcourse/new/frame/index.html 网页CG学习

  8. Trystrtofloat

    TryStrToFloat为 ‘+1’和‘-1’和 ‘.1’是可以装换成功的

  9. WinForm&&DEV知识小结

    -------------------------------------------------------------------------------- 1.父窗体Form1中调用子窗体For ...

  10. 利用backtrace和backtrace_symbols函数打印调用栈信息

    在头文件"execinfo.h"中声明了三个函数用于获取当前线程的函数调用堆栈. #include <execinfo.h>  int backtrace(void * ...