当前位置:Gxlcms > 数据库问题 > mysql的函数与储存过程与pymysql的配合使用

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

时间:2021-07-01 10:21:17 帮助过:7人阅读

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,),)

 

 

 

 

 

 

 

 

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

标签:写法   而且   root   insert   handler   efault   cal   sql   不能   

人气教程排行