18 mysql內建功能 儲存過程

2021-09-10 16:55:45 字數 3311 閱讀 1136

儲存過程包含了一系列可執行的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方...