MySQL 高階(4)
儲存過程
1.什麼是儲存過程
儲存過程是一組任意的sql語句集合,儲存在mysql中,呼叫儲存過程時將會執行其包含的所有sql語句;與python中的函式類似;
2.為什麼使用儲存過程
回顧觸發器與檢視都是為了簡化應用程式中sql語句的書寫,但是還是需要編寫,而儲存過程中可以包含任何的sql語句,包括檢視,事物,流程控制等,這樣一來,應用程式可以從sql語句中完全解放,mysql可以替代應用程式完成資料相關的邏輯處理!
3.三種開發方式對比
1.應用程式僅負責業務邏輯編寫,所有與資料相關的邏輯都交給mysql來完成,通過儲存過程(推薦使用)
優點:
應用程式與資料處理完解耦合,一堆複雜的sql被封裝成了一個簡單的儲存過程,考慮到網路環境因素,效率高
應用程式開發者不需要編寫sql語句,開發效率高
缺點:
python語法與mysql語法區別巨大,學習成本高
並且各種資料庫的語法大不相同,所以移植性非常差
應用程式開發者與BDA的跨部門溝通成本高,造成整體效率低
2.應用程式不僅編寫業務邏輯,還需要編寫所有的sql語句
優點:擴充套件性高,對於應用程式開發者而言,擴充套件性和維護性相較於第一種都有所提高
缺點:sql語句過於複雜,導致開發效率低,且需要考慮sql'優化問題
3.應用程式僅負責業務邏輯,sql語句的編寫交給ORM框架,(常用解決方案)
優點:應用程式開發者不需要編寫sql語句,開發效率高
缺點:執行效率低,由於需要將物件的操作轉化為sql語句,且需要通過網路傳送大量sql
建立儲存過程
語法:create procedure p1(p_type,p_name,data_type)
begin
sql語句......流程控制
end
p_type引數型別
in 表示輸入引數
out 表示輸出引數
inout表示既能輸入又能輸入
p_name 引數名稱
data_type 引數型別 可以是mysql支援的資料型別
案列:使用儲存過程完成對student表的查詢
delimter //
create procedure p1(in int, in int,out res int)
begin
select *from student where Chinese > m and Chinese < n;
set res = 100
在python中呼叫儲存過程
import pymysql
#建立連線
conn = pymysql.connect(
host="127.0.0.1",
user="root",
password="admin",
database="db02"
)
# 獲取遊標
cursor = conn.cursor(pymysql.cursors.DictCursor)
# 呼叫用儲存過程
cursor.callproc("p1",(70,80,0)) #p1為儲存過程名 會自動為為每個值設定變數,名稱為 @_p1_0,@_p1_1,@_p1_2
# 提取執行結果是否有結果取決於儲存過程中的sql語句
print(cursor.fetchall())
# 獲取執行狀態
cursor.execute("select @_p1_2")
print(cursor.fetchone())
刪除儲存過程
drop procedure 過程名稱
注意:修改儲存過程意義不大,不如刪除重寫