---恢復內容開始---
建立儲存過程
-->create procedure p1()
begin
select * from common_menu;
end;
-->call p1();呼叫
---恢復內容結束---
建立儲存過程
-->create procedure p1()
begin
select * from common_menu;
end;
-->call p1();呼叫
drop procedure p1;--------刪除儲存過程
1.show procedure status
顯示資料庫中所有儲存的儲存過程基本資訊,包括所屬資料庫,儲存過程名稱,建立時間等
2.show create procedure sp_name
顯示某乙個儲存過程的詳細資訊
mysql 儲存過程特點
建立 mysql 儲存過程的簡單語法為:
create procedure 儲存過程名字()
([in|out|inout] 引數 datatype
)begin
mysql 語句;
end;
mysql 儲存過程引數如果不顯式指定「in」、「out」、「inout」,則預設為「in」。習慣上,對於是「in」 的引數,我們都不會顯式指定。
1. mysql 儲存過程名字後面的「()」是必須的,即使沒有乙個引數,也需要「()」
2. mysql 儲存過程引數,不能在引數名稱前加「@」,如:「@a int」。下面的建立儲存過程語法在 mysql 中是錯誤的(在 sql server 中是正確的)。 mysql 儲存過程中的變數,不需要在變數名字前加「@」,雖然 mysql 客戶端使用者變數要加個「@」。
create procedure pr_add
(@a int, -- 錯誤
b int -- 正確
)3. mysql 儲存過程的引數不能指定預設值。
4. mysql 儲存過程不需要在 procedure body 前面加 「as」。而 sql server 儲存過程必須加 「as」 關鍵字。
create procedure pr_add
(a int,
b int
)as -- 錯誤,mysql 不需要 「as」
begin
mysql statement ...;
end;
5. 如果 mysql 儲存過程中包含多條 mysql 語句,則需要 begin end 關鍵字。
create procedure pr_add
(a int,
b int
)begin
mysql statement 1 ...;
mysql statement 2 ...;
end;
6. mysql 儲存過程中的每條語句的末尾,都要加上分號 「;」
...declare c int;
if a is null then
set a = 0;
end if;
...end;
7. mysql 儲存過程中的注釋。
declare c int; -- 這是單行 mysql 注釋 (注意 -- 後至少要有乙個空格)
if a is null then # 這也是個單行 mysql 注釋
set a = 0;
end if;
...end;
8. 不能在 mysql 儲存過程中使用 「return」 關鍵字。
set c = a + b;
select c as sum;
end;
9. 呼叫 mysql 儲存過程時候,需要在過程名字後面加「()」,即使沒有乙個引數,也需要「()」
call pr_no_param();
10. 因為 mysql 儲存過程引數沒有預設值,所以在呼叫 mysql 儲存過程時候,不能省略引數。可以用 null 來替代。
mysql的變數分為兩種:系統變數和使用者變數。但是在實際使用中,還會遇到諸如區域性變數、會話變數等概念。根據個人感覺,mysql變數大體可以分為四種型別:
一、區域性變數。
區域性變數一般用在sql語句塊中,比如儲存過程的begin/end。其作用域僅限於該語句塊,在該語句塊執行完畢後,區域性變數就消失了。
區域性變數一般用declare來宣告,可以使用default來說明預設值。
例如在儲存過程中定義區域性變數:
drop procedure if exists add;
create procedure add
in a int,
in b int
begin
declare c int default 0;
set c = a + b;
select c as c;
end;
在上述儲存過程中定義的變數c就是區域性變數
二、使用者變數。
使用者變數的作用域要比區域性變數要廣。使用者變數可以作用於當前整個連線,但是當當前連線斷開後,其所定義的使用者變數都會消失。
使用者變數使用如下(這裡我們無須使用declare關鍵字進行定義,可以直接這樣使用):
select @變數名
對使用者變數賦值有兩種方式,一種是直接用"="號,另一種是用":="號。其區別在於使用set命令對使用者變數進行賦值時,兩種方式都可以使用;當使用select語句對使用者變數進行賦值時,只能使用":="方式,因為在select語句中,"="號被看作是比較操作符。
示例程式如下:
drop procedure if exists math;
create procedure math
in a int,
in b int
begin
set @var1 = 1;
set @var2 = 2;
select @sum:=(a + b) as sum, @dif:=(a - b) as dif;
end;
mysql> call math(3, 4);
+------+------+
| sum | dif |
+------+------+
| 7 | -1 |
+------+------+
1 row in set (0.00 sec)
query ok, 0 rows affected (0.00 sec)
mysql> select @var1; //var1為使用者變數
+-------+
| @var1 |
+-------+
| 1 |
+-------+
1 row in set (0.00 sec)
mysql> select @var2; //var2為使用者變數
+-------+
| @var2 |
+-------+
| 2 |
+-------+
1 row in set (0.00 sec)
4、全域性變數
全域性變數影響伺服器整體操作。當伺服器啟動時,它將所有全域性變數初始化為預設值。這些預設值可以在選項檔案中或在命令列中指定的選項進行更改。要想更改全域性變數,必須具有super許可權。全域性變數作用於server的整個生命週期,但是不能跨重啟。即重啟後所有設定的全域性變數均失效。要想讓全域性變數重啟後繼續生效,需要更改相應的配置檔案。
要設定乙個全域性變數,有如下兩種方式:
set global var_name = value; //注意:此處的global不能省略。根據手冊,set命令設定變數時若不指定global、session或者local,預設使用session
set @@global.var_name = value; //同上
要想檢視乙個全域性變數,有如下兩種方式:
select @@global.var_name;
show global variables like "%var%";
3、會話變數
伺服器為每個連線的客戶端維護一系列會話變數。在客戶端連線時,使用相應全域性變數的當前值對客戶端的會話變數進行初始化。設定會話變數不需要特殊許可權,但客戶端只能更改自己的會話變數,而不能更改其它客戶端的會話變數。會話變數的作用域與使用者變數一樣,僅限於當前連線。當當前連線斷開後,其設定的所有會話變數均失效。
設定會話變數有如下三種方式:
set session var_name = value;
set @@session.var_name = value;
set var_name = value;
檢視乙個會話變數也有如下三種方式:
select @@var_name;
select @@session.var_name;
show session variables like "%var%";
二、使用者變數。
使用者變數的作用域要比區域性變數要廣。使用者變數可以作用於當前整個連線,但是當當前連線斷開後,其所定義的使用者變數都會消失。
使用者變數使用如下(這裡我們無須使用declare關鍵字進行定義,可以直接這樣使用):
select @變數名
對使用者變數賦值有兩種方式,一種是直接用"="號,另一種是用":="號。其區別在於使用set命令對使用者變數進行賦值時,兩種方式都可以使用;當使用select語句對使用者變數進行賦值時,只能使用":="方式,因為在select語句中,"="號被看作是比較操作符。
示例程式如下:
drop procedure if exists math;
create procedure math
in a int,
in b int
begin
set @var1 = 1;
set @var2 = 2;
select @sum:=(a + b) as sum, @dif:=(a - b) as dif;
end;
儲存過程使用
謂儲存過程就是transact sql語句的預編譯集合,這些語句在乙個名稱下儲存並作為乙個單元進行處理。由於儲存過程被預先編譯過,所以執行起來要比單行sql語句效率高出很多,在應用程式開發過程中應盡可能的採用儲存過程進行資料的增加 更新 刪除和查詢操作,以提公升應用程式的整體執行效率。執行sql s...
使用儲存過程
使用儲存過程的目的是 1.通過把過程封裝進單個易於使用的單元中,來簡化操作。2.無須反覆建立一系列步驟,可以確保資料的完整性。3.簡化變更管理。4.改進效能 預編譯 缺點 1.比基本的sql語句更複雜,程式設計師哭暈,dba開心。2.安全許可權問題,資料庫管理員一般都限制儲存過程的建立許可權。只允許...
儲存過程使用
謂儲存過程就是transact sql語句的預編譯集合,這些語句在乙個名稱下儲存並作為乙個單元進行處理。由於儲存過程被預先編譯過,所以執行起來要比單行sql語句效率高出很多,在應用程式開發過程中應盡可能的採用儲存過程進行資料的增加 更新 刪除和查詢操作,以提公升應用程式的整體執行效率。執行sql s...