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))#num1=@_p6_0,num2=@_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,),)

猜你喜欢

转载自www.cnblogs.com/accolade/p/10641834.html