Mysql存儲過程是我們學習Mysql的重要知識點,這篇文章主要給大家講解一下創(chuàng)建存儲的過程是怎樣的。
1、我們?yōu)槭裁匆么鎯^程呢 ?
我們都知道應用程序分為兩種,一種是基于web,一種是基于桌面,他們都和數(shù)據(jù)庫進行交互來完成數(shù)據(jù)的存取工作。假設現(xiàn)在有一種應用程序包含了這兩 種,現(xiàn)在要修改其中的一個查詢sql語句,那么我們可能要同時修改他們中對應的查詢sql語句,當我們的應用程序很龐大很復雜的時候問題就出現(xiàn)這,不易維 護!另外把sql查詢語句放在我們的web程序或桌面中很容易遭到sql注入的破壞。而存儲例程正好可以幫我們解決這些問題。
2、創(chuàng)建存儲過程
創(chuàng)建存儲過程這塊主要有兩種,一種是帶參數(shù)的,一種是不帶參數(shù)的,先講不帶參數(shù)的再說不帶參數(shù)的
不帶參數(shù)案例:
-- 創(chuàng)建存儲過程
delimiter // --自定義語句結(jié)尾符號,因為這里要執(zhí)行好多句sql語句,所以就得自定義,以防止出錯
create procedure p1()
BEGIN
select * from tab1;
END//
delimiter ; --自定義局域結(jié)尾符號結(jié)束
-- 執(zhí)行存儲過程
call p1()
帶參數(shù)案例這塊主要有三個類
in 僅用于傳入?yún)?shù)用
out 僅用于返回值用
inout 既可以傳入又可以當作返回值
-- 創(chuàng)建存儲過程
delimiter \\
create procedure p1(
in i1 int, -- 傳入?yún)?shù)i1
in i2 int, -- 傳入?yún)?shù)i2
inout i3 int, -- 即傳入又能得到返回值
out r1 int -- 得到返回值
)
BEGIN
DECLARE temp1 int;
DECLARE temp2 int default 0;
set temp1 = 1;
set r1 = i1 + i2 + temp1 + temp2;
set i3 = i3 + 100;
end\\
delimiter ;
-- 執(zhí)行存儲過程
DECLARE @t1 INT default 3; -- 設置變量默認值為3
DECLARE @t2 INT; -- 設置變量
CALL p1 (1, 2 ,@t1, @t2); -- 執(zhí)行存儲過程,并傳入?yún)?shù),t2自動取消
SELECT @t1,@t2; -- 查看存儲過程輸出結(jié)果
2、刪除存儲過程
drop procedure p1;
3、python用pymysql模塊調(diào)用存儲過程,因為我們學習這些就是為了語言調(diào)用
#!/usr/bin/env python
# -*- coding:utf-8 -*-
import pymysql
conn = pymysql.connect(host='127.0.0.1', port=3306, user='root', passwd='', db='day39b_')
cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)
# 執(zhí)行存儲過程
row = cursor.callproc('p1',(1,2,3))
# 存儲過程的查詢結(jié)果
selc = cursor.fetchall()
print(selc)
# 獲取存儲過程返回
effect_row = cursor.execute('select @_p1_0,@_p1_1,@_p1_2')
# 曲存儲過程的返回值
ret = cursor.fetchone()
print(ret)
# 提交,不然無法保存新建或者修改的數(shù)據(jù)
conn.commit()
# 關閉游標
cursor.close()
# 關閉連接
conn.close()
文章來自:博客園/張巖林