mysql儲存過程詳解(概念、優缺點以及建立呼叫例項)
原創小糖豆巴拉巴拉 發布於2019-05-31 17:45:06 閱讀數 705 收藏
展開這篇文章主要介紹一下儲存過程,工作中是否用的到儲存過程,很大程度跟公司有關,很多人用不上,所以不了解,閒暇之際,還是簡單的總結了一下。
1、儲存過程是什麼?
其實儲存過程很簡單,無非就是按照其特定的語法,建立儲存過程,然後在執行程式的時候,呼叫就行了。
怎麼呼叫呢?下面是乙個建立儲存過程的例項
create procedure myproc()
begin
select count(*) from test;
end在mysql資料庫中函式一欄,可以看到儲存過程函式
然後把原本寫的sql語句的地方直接換成call myproc,就可以執行了,跟執行select count(*) from test;是一樣的結果
2、儲存過程和普通sql語句有什麼不同?
儲存過程就是把sql語句放在資料庫建立,然後直接編譯,然後程式就可以重複直接呼叫了。
3、儲存過程有什麼優缺點?
3.1 優點
儲存過程在建立的時候直接編譯,而sql語句每次使用都要編譯,提高執行效率
乙個儲存過程可以被重複使用。(其實sql語句也可以,沒什麼卵用)
一條sql語句,可能需要訪問幾張表,對資料庫連線好幾次,儲存過程只會連線一次
儲存的程式是安全的。資料庫管理員可以向訪問資料庫中儲存過程的應用程式授予適當的許可權,而不向基礎資料庫表提供任何許可權。(大概這就是儲存過程存在的原因吧)
3.2 缺點
可移植性太差了
對於簡單的sql語句,毫無意義
對於只有一類使用者的系統安全性毫無意義
團隊開發,標準不定好的話,後期維護很麻煩
對於開發和除錯都很不方便。
複雜的業務邏輯,用儲存過程還是很吃力的
基本上面的有點都是效能更快,但伺服器也不會因為這一點效能而變得很慢,所以基本用儲存過程的很少,一般情況下,不建議使用,比較麻煩,除非有特定需求。
4、呼叫例項
4.1檢視儲存過程狀態
通過下面語句可以看到該資料庫下所有的儲存過程名稱
show procedure status
1也可以在資料庫的函式一欄看到儲存過程
4.2 檢視儲存過程詳細
show create procedure dada
1dada是儲存過程函式名稱
4.3 乙個簡單的儲存過程例項
delimiter //
create procedure dada(out s int)
begin
select count(*) into s from mysql.user;
end//
delimiter;
這裡先解釋一下delimiter //是什麼意思
mysql客戶端中分隔符預設是分號(;),所以如果不指定乙個特殊的分隔符,可能會編譯失敗
上面語句將分隔符改為//,直到遇到下乙個//才表示語句結束,這樣可以保證建立語句完整。
上面的select count(*) into s from mysql.user;語句中 into s的意思對應out s int,表示宣告輸出值為乙個int型別的值
其實不宣告上面的輸出值也是沒問題的
delimiter //
create procedure dede()
begin
select count(*)from testfield.test_obe_event;
end//
delimiter;
初上面解釋之外,建立語句還是很容易懂得,這裡不做其他解釋
5、儲存過程引數解釋
上面都是比較簡單的儲存過程,但是大多數情況下都是有引數的,下面介紹儲存過程的引數
5.1 、帶輸入引數的儲存過程
drop procedure if exists sp1 //
create procedure sp1(in p int)
comment 'insert into a int value'
begin
/* 將輸入引數的值賦給變數 */
set @v1 = p;(這裡只是讓大家學習一種變數宣告方式,直接在v1前面加@,表示宣告變數,也可以用declare v1 int宣告)
insert into test(id) values(v1);
end//
/* 呼叫這個儲存過程 */
call sp1(1)//
/* 去資料庫檢視呼叫之後的結果 */
select * from test//
5.2、帶輸出引數的儲存過程
drop procedure if exists sp2 //
create procedure sp2(out p int)
begin
select max(id) into p from test;
end//
call sp2(@pv)//(呼叫該儲存過程,注意:輸出引數必須是乙個帶@符號的變數)
/* 查詢剛剛在儲存過程中使用到的變數 */
select @pv//
5.3、帶輸入和輸出引數的儲存過程
drop procedure if exists sp3 //
create procedure sp3(in p1 int , out p2 int)
begin
if p1 = 1 then
set @v = 10;(直接在v1前面加@,表示宣告變數,也可以用declare v1 int宣告)
else
set @v = 20;
end if;
/* 語句體內可以執行多條sql,但必須以分號分隔 */
insert into test(id) values(@v);
select max(id) into p2 from test;
end//
/*呼叫該儲存過程,注意:輸出引數必須是乙個帶@符號的變數*/
call sp3(1,@ret)//
select @ret//
5.4、既做輸入又做輸出引數的儲存過程
drop procedure if exists sp4 //
create procedure sp4(inout p4 int)
begin
if p4 = 4 then
set @pg = 400;
else
set @pg = 500;
end if;
select @pg;
end//
call sp4(@pp)//
/* 這裡需要先設定乙個已賦值的變數,然後再作為引數傳入 */
set @pp = 4//
call sp4(@pp)//
mysql儲存過程 MySQL儲存過程
在本節中,您將逐步學習如何在mysql中編寫和開發儲存過程。首先,我們向您介紹儲存過程的概念,並討論何時使用它。然後,展示如何使用過程 的基本元素,如建立儲存過程的語句,if else,case,loop,儲存過程的引數。下面每個教程都包含了易於理解的示例和詳細的說明。如果您瀏覽並學習所有教程,您可...
mysql 儲存過程 mysql 儲存過程
建立 為建立儲存過程的結束標誌,使用delimiter 可更改標誌 格式create procedure begin sqlend create procedure myprocedure in param integer begin select from tb role where tb rol...
mysql 儲存過程 MySQL儲存過程
目錄 儲存過程 簡介是一組為了完成特定功能的sql語句集合 比傳統sql速度更快 執行效率更高 儲存過程的優點 執行一次後,會將生成的二進位制 駐留緩衝區,提高執行效率 sql語句加上控制語句的集合,靈活性高 在伺服器端儲存,客戶端呼叫時,降低網路負載 可多次重複被呼叫,可隨時修改,不影響客戶端呼叫...