1. 程式人生 > >mysql內置功能—存儲過程

mysql內置功能—存儲過程

port python conn 結合 close 刪除 fetch 實現 cal

一 存儲過程

存儲過程實際上是MySQL內置功能一系列的總和,基於MySQL內置功能把邏輯寫好,基於存儲過程把它封裝成一個功能。

一 存儲過程介紹

存儲過程包含了一系列可執行的sql語句,存儲過程存放於MySQL中,通過調用它的名字可以執行其內部的一堆sql

使用存儲過程的優點:

#1. 用於替代程序寫的SQL語句,實現程序與sql解耦

#2. 基於網絡傳輸,傳別名的數據量小,而直接傳sql數據量大

使用存儲過程的缺點:

#1. 程序員擴展功能不方便

補充:程序與數據庫結合使用的三種方式

#方式一:
    MySQL:存儲過程
    程序:調用存儲過程

#方式二:
    MySQL:
    程序:純SQL語句

#方式三:
    MySQL:
    程序:類和對象,即ORM(本質還是純SQL語句)

二 創建簡單存儲過程(無參)

# 創建儲存過程
delimiter // create procedure p1() # p1為存儲過程名稱 BEGIN select * from blog; # blog是表名 INSERT into blog(name,sub_time) values("xxx",now()); END // delimiter ; #在mysql中調用 call p1(); #在python中基於pymysql調用 cursor.callproc(‘p1‘) print(cursor.fetchall()) # 拿結果

三 創建存儲過程(有參)

對於存儲過程,可以接收參數,其參數有三類:

#in          僅用於傳入參數用
#out        僅用於返回值用
#inout     既可以傳入又可以當作返回值
delimiter //
create procedure p2(
    in n1 int,
    in n2 int
out res int ) BEGIN select * from blog where id > n1 and id <n2;
set res =1; # 成功返回res(1) END // delimiter ; #在mysql中調用
set @x=0 # 設置初始值 call p2(3,2,@x)
select @x # 查看返回值 #在python中基於pymysql調用
cursor.callproc(‘p2‘,(3,2,0)) # 不用 set @x=0 callproc本質@_p2_0=3,@_p2_1=2,@_p2_2=0 print(cursor.fetchall())
cursor.execute(‘select@_p2_2‘) # 查看返回值
print(cursor.fetchone()) in:傳入參數
delimiter //
create procedure p3(
    in n1 int,
    out res int
)
BEGIN
    select * from blog where id > n1;
    set res = 1;
END //
delimiter ;

#在mysql中調用
set @res=0; #0代表假(執行失敗),1代表真(執行成功)
call p3(3,@res);
select @res;

#在python中基於pymysql調用
cursor.callproc(‘p3‘,(3,0)) #0相當於set @res=0
print(cursor.fetchall()) #查詢select的查詢結果

cursor.execute(‘select @_p3_0,@_p3_1;‘) #@p3_0代表第一個參數,@p3_1代表第二個參數,即返回值
print(cursor.fetchall())

out:返回值
delimiter //
create procedure p4(
    inout n1 int
)
BEGIN
    select * from blog where id > n1;
    set n1 = 1;
END //
delimiter ;

#在mysql中調用
set @x=3;
call p4(@x);
select @x;


#在python中基於pymysql調用
cursor.callproc(‘p4‘,(3,))
print(cursor.fetchall()) #查詢select的查詢結果

cursor.execute(‘select @_p4_0;‘) 
print(cursor.fetchall())

inout:既可以傳入又可以返回

四 執行存儲過程

-- 無參數
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)

執行存儲過程

在MySQL中執行存儲過程-- 無參數
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)

執行存儲過程

在MySQL中執行存儲過程
#!/usr/bin/env python
# -*- coding:utf-8 -*-
import pymysql

conn = pymysql.connect(host=‘127.0.0.1‘, port=3306, user=‘root‘, passwd=‘123‘, db=‘t1‘)
cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)
# 執行存儲過程
cursor.callproc(‘p1‘, args=(1, 22, 3, 4))
# 獲取執行完存儲的參數
cursor.execute("select @_p1_0,@_p1_1,@_p1_2,@_p1_3")
result = cursor.fetchall()

conn.commit()
cursor.close()
conn.close()


print(result)

在python中基於pymysql執行存儲過程

五 刪除存儲過程

drop procedure proc_name;

mysql內置功能—存儲過程