儲存過程中的變數定義

2021-09-08 04:34:43 字數 4140 閱讀 2753

as we all know,mysql的儲存過程就類似於指令碼,既然似指令碼就會有使用到變數的時候。

mysql儲存過程常見的變數:區域性變數、使用者變數、系統變數……

一、區域性變數

在過程體中,可以宣告區域性變數,用來臨時儲存一些值。

1、定義區域性變數語法:

declare  var_name[, var_name] ...  type [default value];

其中,type為mysql的資料型別,如:int、float、date、varchar(length)

注意:①declare用來宣告區域性變數,且declare僅被用在begin ... end復合語句裡,並且必須在復合語句的開頭,在任何其它語句之前;可以被用在巢狀的塊中,除了那些用相同名字宣告變數的塊。

②如果要給變數提供乙個預設值,使用default子句(值可以是常數,也可以指定為乙個表示式);如果沒有default子句,初始值為null。

2、基本格式:

create procedure sp_name ([proc_parameter[,...]])

begin

declare var_name1 type [default value];

declare var_name2 type [default value];

declare……;

[characteristic ...];

end

例1:建立過程,為區域性變數指定預設值,並呼叫該過程

mysql>delimiter $$

mysql> create procedure test1(out num1 int

) ->begin

-> declare num2 int

default

100;

-> set num1=num2;

->end

->$$

mysql>delimiter ;

mysql>call test1(@num);

mysql> select

@num;

+------+

| @num |

+------+

| 100 |

+------+

解析:

建立test1儲存過程:輸出的是num1變數的值,宣告區域性變數num2是int型別、預設值是100,用set將num2的值(未處理,則預設值)賦給num1;

呼叫test1:用使用者變數num去接收儲存過程的輸出值num1……

預設值除了字面量,還可以是複雜的表示式,包括標量子查詢

例2:建立過程,使用所有球員的數量來初始化乙個變數

mysql>delimiter $$

mysql> create procedure test2(out num1 int

) ->begin

-> declare num2 int

default(select count(*) from

players);

-> set num1=num2;

->end$$

mysql>delimiter ;

mysql>call test2(@num);

mysql> select

@num;

+------+

| @num |

+------+

| 14 |

+------+

注意:mysql不支援陣列作為區域性變數。

3、區域性變數的作用域:

也就是變數能正常使用而不出錯的程式塊的範圍。

在巢狀塊的情況下,

在外部塊中宣告的變數可以在內部塊中直接使用;

在內部塊中宣告的變數只能在內部塊中使用。

解析:變數v2只能用在內部塊b2中,塊b3中的set語句和最後一條set語句都是錯誤的。

二、使用者變數

>使用者變數與資料庫連線有關:在當前連線中宣告的變數,在連線斷開的時候,就會消失;在此連線中宣告的變數無法在另一連線中使用。

>乙個@符號表示的就是使用者變數。

1、使用者變數的定義(set、select):

1)set語句為使用者變數賦值:

可以使用「=」或「:=」作為分配符;

分配給每個變數的expr可以為整數、實數、字串或者null值;

mysql> set @zjc:=999

;mysql> select

@zjc;

+------+

| @zjc |

+------+

| 999 |

+------+

2)select語句為使用者變數賦值:

分配符必須為「:=」而不能用「=」,因為在非set語句中=被視為乙個比較操作符;

mysql> select @abc:=123

;+-----------+

| @abc:=123 |

+-----------+

| 123 |

+-----------+mysql> select

@abc;

+------+

| @abc |

+------+

| 123 |

+------+

注意:

①使用者變數隨處可以定義,隨處可以使用;不定義可以直接使用(值預設為null)。

②使用者變數的變數名的形式:@var_name,要有@符號。

③濫用使用者變數會導致程式難以理解及管理。

拓展之變數賦值:set語法

mysql裡面的變數是不嚴格限制資料型別的,變數的資料型別根據賦給變數的值而隨時變化。

set variable_assignment [, variable_assignment] ...

variable_assignment:

user_var_name =expr

|[global | session] system_var_name =expr

|[@@global. | @@session. | @@] system_var_name = expr

##用來給使用者變數、系統變數賦值,也可以給過程中的區域性變數賦值。

注意:set系統變數時,不帶作用域修飾,預設是指會話作用域;

(特別注意,有些系統變數不帶作用域修飾,無法設定,因此最好都帶上作用域設定系統變數)。

2、使用者變數的作用域

只要是在當前連線定義的使用者變數,在當前連線裡用都是ok的,除此之外都不行。

3、與區域性變數區別:

區域性變數只有變數名字,沒有@符號;使用者變數名前有@符號。

都是先定義,再使用;未定義的變數,select值為空。

區域性變數只在儲存過程內部使用,在過程體外是沒有意義的,當begin-end塊處理完後,區域性變數就消失;而使用者變數可以用在儲存過程的內部和外部。

tips:在儲存過程內部,使用區域性變數,不要使用使用者變數。

三、mysql變數之使用者變數與系統變數

1、使用者變數如上所述@var_name(乙個@符號)

①使用者變數和資料庫連線有關,連線後宣告變數,連線斷開後,自動消失;

②select乙個沒有賦值的使用者變數,返回null,也就是沒有值;

mysql的變數類似於動態語言,變數的值隨所要賦的值的型別而改變。

2、系統變數:根據系統變數的作用域分為:全域性變數與會話變數(兩個@符號)

①全域性變數(@@global.)

在mysql啟動的時候由伺服器自動將全域性變數初始化為預設值;

全域性變數的預設值可以通過更改mysql配置檔案(my.ini、my.cnf)來更改。

②會話變數(@@session.)

在每次建立乙個新的連線的時候,由mysql來初始化;

mysql會將當前所有全域性變數的值複製乙份來做為會話變數(也就是說,如果在建立會話以後,沒有手動更改過會話變數與全域性變數的值,那所有這些變數的值都是一樣的)。

#全域性變數與會話變數的區別:對全域性變數的修改會影響到整個伺服器,但是對會話變數的修改,只會影響到當前的會話。

mysql儲存過程中變數的使用

在mysql儲存過程中,宣告乙個變數可以使用declare vi num 變數名 int 資料型別 的方式。還可以直接使用 變數名的方式,直接使用乙個變數。請看以下儲存過程 drop procedure if exists pro2 create procedure pro2 begin decla...

儲存過程中呼叫儲存過程

use northwind go 儲存過程1 功能 通過員工firstname inputempfirstname 獲得 員工id outid if exists select name from sysobjects where name p getempleeidbyname and type ...

Oracle儲存過程中定義多個游標

1 直接定義多個顯示游標 create orreplace procedure acc.dbp realcitytrafficcnt is cursor cur1 is select 第乙個游標 cursor cur2 is select 第二個游標 begin 呼叫cur1 begin open ...