mysql的函数与储存过程与pymysql的配合使用

Posted accolade

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了mysql的函数与储存过程与pymysql的配合使用相关的知识,希望对你有一定的参考价值。

现在mysql上定义一个函数,一个储存过程

函数:

 delimiter \                CREATE FUNCTION f2 ( num2 INT, num1 INT ) RETURNS INT BEGIN
                    DECLARE
                        a DEFAULT INT 1;

                    SET a = num1 * num2;
                RETURN ( a ) ;
                END  \                delimiter;

 

 函数式是计算两个值相乘的

 在mysql的调用

select f2(9,5); -- 45

 

 同时函数可以是配合select 函数 from 来使用的;函数里面不能写select * from 这样的语言。

 储存过程(或者是事物)

 定义

delimiter \CREATE DEFINER=`root`@`localhost` PROCEDURE `p6`(inout check_num tinyint,
inout num int)
begin
    declare exit handler for SQLEXCEPTION
    begin 
    set check_num=1;
    rollback;
end;
    
    start transaction ;
    select * from class;
    set num = num *check_num;
    insert into class(caption)values(高三九班),(拒水小学wu年级九班);
    commit; 
    select * from class;
    set check_num=2;
end \    delimiter ;

 

 在mysql上调用事物:

set @a=6;
set @b=5;
call p6(@a,@b);
select @a,@b;

 

 在mysql必须要定义一个全局的变量。然后传值,在查看值得变化,来判断事物是否执行成功,在事物的内部,会显示出来,但是如果有错误,便会对值不会进行修改,而且修改的值必须要进行commit才能修改或者上传成功。

我去,意外发现:

在mysql上定义事物p7

 1 delimiter \ 2 
 3 CREATE DEFINER=`root`@`localhost` PROCEDURE `p7`(inout check_num tinyint,
 4 inout num int)
 5 begin
 6     declare exit handler for SQLEXCEPTION
 7     begin 
 8     set check_num=1;
 9     rollback;
10     end;
11     
12     start transaction ;
13     select * from class;
14     set num = num *check_num;
15     insert into class(caption)values(p7高三九班),(p7拒水小学wu年级九班);
16     commit; 
17     select * from class;
18     insert into class(caption)values(p7高十八班,p7wu年级九班);
19     commit;
20     set check_num=2;
21     end \22     delimiter ;

 

 你看一下定义的事物,你会发现18行是错误的写法,也就是说mysql会报错,然后我再去调用这个事物

set @a=6;
set @b=5;
call p7(@a,@b);
select @a,@b;

 

 发现@a=1 @b=30 就是说在12到17行的代码全部都调用了,而且因为里面有个commit所以说表class里面确实是添加(‘p7高三九班‘),(‘p7拒水小学wu年级九班‘)这两个变量。

结论:事物的本质是commit的使用,所以需要将检测的数字和commit放在最后,因为事物的代码是会执行的,执行到了错误地地方,才会走报错的地方,因此在写事物的时候,一定要注意commit的位置。

在pymysql里面调用函数和储存过程(以及事物)

import pymysql
conn=pymysql.connect(host=localhost,user=root,password=‘‘,database=review60,charset=utf8)
cursor=conn.cursor()#得到信息是以字典的形式
sql =select f2(3,4)
cursor.execute(sql)
a=cursor.fetchall()
print(f2(3,4)的返回值:,a)
num1=3
num2=4
cursor.callproc(p6,(num1,num2))#[email protected]_p6_0,[email protected]_p6_1
print(第一次的p6返回值:,cursor.fetchall())
print(num1 num2:,num1,num2)
cursor.execute(select @_p6_0)
num1=cursor.fetchall()#成功返回2,失败返回1
print(查看返回值num1:,num1)
cursor.execute(select @_p6_1)
num2=cursor.fetchall()#返回num1 x num2
print(查看返回值num2:,num2)
cursor.close()
conn.close()

 

 结果:

f2(3,4)的返回值: ((12,),)
第一次的p6返回值: 一个很长的列表
num1 num2: 3 4
查看返回值num1: ((2,),)
查看返回值num2: ((12,),)

 

 

 

 

 

 

 

 

以上是关于mysql的函数与储存过程与pymysql的配合使用的主要内容,如果未能解决你的问题,请参考以下文章

Mysql储存过程1: 设置结束符与储存过程创建

Mysql储存过程2:变量定义与参数传递

sql之储存过程与函数的区别

MySQL 储存过程-原理语法函数详细说明

Six——tornado操作之用户表单(密码,用户名)数据库迁移使用SQLAlchemy+pymysql配合alembic实现!

9.储存过程