存儲過程包含了一系列可執行的sql語句,存儲過程存放於MySQL中,經過調用它的名字能夠執行其內部的一堆sqlpython
存儲過程的優勢:
1.程序與數據實現解耦
2.減小網絡傳輸的數據量
mysql
建立無參的存儲過程sql
===========建立無參的存儲過程=============== delimiter // create procedure p1() begin select * from test; insert into test(username,dep_id) VALUES('egon',1); end // delimiter ; #調用存儲過程 #在mysql中調用 call p1(); #在python程序中調用 cursor.callproc('p1')
對於存儲過程,能夠接收參數,其參數有三類:數據庫
# in 僅用於傳入參數用 # out 僅用於返回值用 # inout 既能夠傳入又能夠看成返回值
==========建立有參的存儲過程(in)=============== delimiter // create procedure p2( in m int, #從外部傳進來的值 in n int ) begin insert into test(username,dep_id) VALUES ('haha',2),('xixi',3),('sasa',1),('yanyan',2); select * from test where id between m and n; end // delimiter ; #調用存儲過程 call p2(3,7); #在mysql中執行 #在python程序中調用 cursor.callproc('p2',arg(3,7))
===========建立有參的存儲過程(out)=============== delimiter // create procedure p3( in m int, #從外部傳進來的值 in n int, out res int ) begin select * from test where id between m and n; set res = 1;#若是不設置,則res返回null end // delimiter ; #調用存儲過程 set @res = 11111; call p3(3,7,@res); select @res; #在mysql中執行 #在python中 res=cursor.callproc('p3',args=(3,7,123)) #@_p3_0=3,@_p3_1=7,@_p3_2=123 print(cursor.fetchall()) #只是拿到存儲過程當中select的查詢結果 cursor.execute('select @_p3_0,@_p3_1,@_p3_2') print(cursor.fetchall()) #能夠拿到的是返回值
=============建立有參存儲過程之inout的使用========== delimiter // create procedure p4( inout m int ) begin select * from test where id > m; set m=1; end // delimiter ; #在mysql中 set @x=2; call p4(@x); select @x; =========================== delimiter // create procedure p5( inout m int ) begin select * from test11111 where id > m; set m=1; end // delimiter ; #在mysql中 set @x=2; call p5(@x); select @x; #這時因爲不存在那個表就會報錯,查看的結果就成2了。
-- 無參數 call proc_name() -- 有參數,全in call proc_name(1,2) -- 有參數,有in,out,inout set @t1=0; set @t2=3; call proc_name(1,2,@t1,@t2)
drop procedure proc_name;
#方式一:
MySQL:存儲過程
程序:調用存儲過程
#方式二:
MySQL:
程序:純SQL語句
#方式三:
MySQL:
程序:類和對象,即ORM(本質仍是純SQL語句)
import pymysql conn = pymysql.connect(host = 'localhost',user = 'root',password='123456',database = 'lianxi',charset = 'utf8') cursor = conn.cursor(pymysql.cursors.DictCursor) #以字典的形式輸出 # rows = cursor.callproc('p1') #1.調用存儲過程的方法 ,沒參數時 # rows = cursor.callproc('p2',args=(3,7)) #有參數時 rows = cursor.callproc('p3', args=(3,7,123)) #@_p3_0=3,@_p3_1=7 ,@_p3_2=123 #有參數時 conn.commit() #執行 print(cursor.fetchall()) cursor.execute('select @_p3_0,@_p3_1,@_p3_2') print(cursor.fetchall()) cursor.close() conn.close()