5.13 數據庫存儲過程

存儲過程

概念

存儲過程包含了一系列可執行的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()
相關文章
相關標籤/搜索