1. 程式人生 > >mysql的函數與儲存過程與pymysql的配合使用

mysql的函數與儲存過程與pymysql的配合使用

fault oot select 函數 cal 判斷 gin hal into roo

現在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的配合使用