mysql的函數與儲存過程與pymysql的配合使用
阿新 • • 發佈:2019-04-02
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的配合使用