mysql儲存過程的重寫 MySQL儲存過程

2021-10-19 19:23:31 字數 2679 閱讀 8502

一、什麼是儲存過程?

儲存過程(stored procedure)是一種在資料庫中儲存複雜程式,以便外部程式呼叫的一種資料庫物件。

儲存過程是為了完成特定功能的sql語句集,經編譯建立並儲存在資料庫中,使用者可通過指定儲存過程的名字並給定引數(需要時)來呼叫執行。

儲存過程思想上很簡單,就是資料庫 sql 語言層面的**封裝與重用。

優點儲存過程可封裝,並隱藏複雜的商業邏輯。

儲存過程可以回傳值,並可以接受引數。

儲存過程無法使用 select 指令來執行,因為它是子程式,與檢視表,資料表或使用者定義函式不同。

儲存過程可以用在資料檢驗,強制實行商業邏輯等。

缺點儲存過程,往往定製化於特定的資料庫上,因為支援的程式語言不同。當切換到其他廠商的資料庫系統時,需要重寫原有的儲存過程。

儲存過程的效能調校與撰寫,受限於各種資料庫系統。

二、建立儲存過程

儲存過程就是具有名字的一段**,用來完成乙個特定的功能。

建立的儲存過程儲存在資料庫的資料字典中。

語法格式如下:

create procedure ( [過程引數[,…] ] )

[過程引數[,…] ] 格式

[ in | out | inout ]

語法說明如下:

1)過程名

儲存過程的名稱,預設在當前資料庫中建立。若需要在特定資料庫中建立儲存過程,則要在名稱前面加上資料庫的名稱,即 db_name.sp_name。需要注意的是,名稱應當盡量避免選取與 mysql 內建函式相同的名稱,否則會發生錯誤。

2)過程引數

儲存過程的引數列表。其中,為引數名,為引數的型別(可以是任何有效的 mysql 資料型別)。當有多個引數時,引數列表中彼此間用逗號分隔。儲存過程可以沒有引數(此時儲存過程的名稱後仍需加上一對括號),也可以有 1 個或多個引數。

mysql 儲存過程支援三種型別的引數,即輸入引數、輸出引數和輸入/輸出引數,分別用 in、out 和 inout 三個關鍵字標識。其中,輸入引數可以傳遞給乙個儲存過程,輸出引數用於儲存過程需要返回乙個操作結果的情形,而輸入/輸出引數既可以充當輸入引數也可以充當輸出引數。需要注意的是,引數的取名不要與資料表的列名相同,否則儘管不會返回出錯資訊,但是儲存過程的 sql 語句會將引數名看作列名,從而引發不可預知的結果。

3)過程體

儲存過程的主體部分,也稱為儲存過程體,包含在過程呼叫的時候必須執行的

sql 語句。這個部分以關鍵字 begin 開始,以關鍵字

end 結束。若儲存過程體中只有一條 sql 語句,則可以省略

begin-end 標誌。

在儲存過程的建立中,經常會用到乙個十分重要的 mysql 命令,即 delimiter 命令,特別是對於通過命令列的方式來操作 mysql 資料庫的使用者,更是要學會使用該命令。

在 mysql 中,伺服器處理 sql 語句預設是以分號作為語句結束標誌的。然而,在建立儲存過程時,儲存過程體可能包含有多條 sql 語句,這些 sql 語句如果仍以分號作為語句結束符,那麼 mysql 伺服器在處理時會以遇到的第一條 sql 語句結尾處的分號作為整個程式的結束符,而不再去處理儲存過程體中後面的 sql 語句,這樣顯然不行。為解決這個問題,通常可使用 delimiter 命令將結束命令修改為其他字元。

delimiter

語法說明如下:

是使用者定義的結束符,通常這個符號可以是一些特殊的符號,如兩個「?」或兩個「¥」等。

當使用 delimiter 命令時,應該避免使用反斜槓「\」字元,因為它是 mysql 的轉義字元。

三、呼叫儲存過程:

call 儲存過程名[(傳參)];

示例:1、建立資料庫,備份資料表用於示例操作:

mysql> create database db1;

mysql> use db1;

mysql> create table players as select * from tennis.players;

mysql> create table matches as select * from tennis.matches;

2、建立儲存過程,刪除給定球員參加的所有比賽:

mysql> delimiter $$  #將語句的結束符號從分號;臨時改為兩個$$(可以是自定義)

mysql> create procedure delete_matches(in p_playerno integer)

-> begin

-> delete from matches

-> where playerno = p_playerno;

-> end$$ query ok, 0 rows affected (0.01 sec)

mysql> delimiter;  #將語句的結束符號恢復為分號

3、呼叫儲存過程

mysql>calldelete_matches(57);

四、儲存過程的引數

mysql儲存過程的引數用在儲存過程的定義,共有三種引數型別,in,out,inout,形式如:

create  procedure 儲存過程名([[in |out |inout ] 引數名 資料類形...])

in 輸入引數:表示呼叫者向過程傳入值(傳入值可以是字面量或變數)

out 輸出引數:表示過程向呼叫者傳出值(可以返回多個值)(傳出值只能是變數)

inout 輸入輸出引數:既表示呼叫者向過程傳入值,又表示過程向呼叫者傳出值(值只能是變數)

原文:

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語句加上控制語句的集合,靈活性高 在伺服器端儲存,客戶端呼叫時,降低網路負載 可多次重複被呼叫,可隨時修改,不影響客戶端呼叫...