儲存過程使用

2022-08-21 03:24:18 字數 4984 閱讀 6775

---恢復內容開始---

建立儲存過程 

-->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...