1. 程式人生 > >MySQL 高階(4)

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 過程名稱

注意:修改儲存過程意義不大,不如刪除重寫