儲存過程包含了一系列可執行的sql語句,儲存過程存放於mysql中,通過呼叫它的名字可以執行其內部的一堆sql
使用儲存過程的優點:
#1. 用於替代程式寫的sql語句,實現程式與sql解耦
#2. 基於網路傳輸,傳別名的資料量小,而直接傳sql資料量大
使用儲存過程的缺點:
#1. 程式設計師擴充套件功能不方便
補充:程式與資料庫結合使用的三種方式
#方式一:
mysql:儲存過程
程式:呼叫儲存過程
#方式二:
mysql:
程式:純sql語句
#方式三:
mysql:
程式:類和物件,即orm(本質還是純sql語句)
delimiter //
create procedure p1()
begin
select * from blog;
insert into blog(name,sub_time) values("***",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
)begin
select * from blog where id > n1;
end //
delimiter ;
#在mysql中呼叫
call p2(3,2)
#在python中基於pymysql呼叫
cursor.callproc('p2',(3,2))
print(cursor.fetchall())
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執行儲存過程
rop procedure proc_name;
18 MySQL加鎖處理分析
by何登成 by何登成 這篇部落格提到了乙個無比微妙的死鎖情況,涉及innodb死鎖預防。這篇文章從乙個簡單的sql語句delete from t1 where id 10 分析在各種情況下的加鎖情況。以下為這篇文章的目錄,感謝何博士的分享。1 背景 1 1.1 mvcc snapshot read...
MySQL必知必會 18MySQL更新資料
mysql必知必會 18mysql更新資料,基本的update語句由3部分組成,分別是 要更新的表 列名和它們的新值 確定要更新行的過濾條件。set子句設定cust email列為指定的值 在更新多個列時,只需要使用單個set命令,每個 列 值 對之間用逗號分隔 最後一列之後不用逗號 update語...
18 儲存過程
建立儲存過程 sql server 2000 以下例子使用的是jdbc driver2.0 企業管理器 儲存過程 建立儲存過程 例一 讀取資料的儲存過程 create procedure selectinfo asselect from dtree go在jsp中呼叫該儲存過程selectinfo方...