MYSQL之儲存過程詳解

2021-09-24 15:27:28 字數 4286 閱讀 2229

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

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

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

create

[definer=]

不寫則預設為definer

=`db_user`

@`%`

procedure sp_name 自定義名字

([proc_parameter[

,...

]]引數)

[characteristic ...

]特性 routine_body sql語言主體

proc_parameter:[in

|out

|inout

] param_name type

characteristic:

comment

'string'

|language

sql|

[not

]deterministic||

sqlsecurity

設定安全性:

definer 只有定義者才能呼叫,預設為definer

;invoker 擁有許可權的使用者才能呼叫。

routine_body:

valid sql routine statement

[begin_label:

]begin

[statement_list]

……end[end_label]

示例:

delimiter

//

create

procedure

sp_simon_test

(in season varchar(50

))begin

select

*from goods_detail where 季節= season limit 10

;end

//delimiter

;

呼叫儲存過程

call

proc_name

([parameter[

,...]]

)

示例:

call sp_simon_test

("夏"

)

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

create procedure 過程名字(in | out | inout 引數名  引數型別)
in 輸入引數:表示呼叫者向過程傳入值(傳入值可以是字面量或變數)

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

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

in輸入引數:

mysql> delimiter $$

mysql> create procedure in_param

(in p_in int)

-> begin

->   select p_in;

->

set p_in=2;

-> select p_in;

-> end$$

mysql> delimiter ;

mysql>

set @p_in=1;

mysql> call in_param

(@p_in);+

------+

| p_in |+--

----+|

1|+--

----++

------+

| p_in |+--

----+|

2|+--

----+

mysql> select @p_in;+--

-----+

| @p_in |+--

-----+

|1|+

-------

+

out 輸出引數:

mysql> delimiter //

mysql> create procedure out_param

(out p_out int)

-> begin

-> select p_out;

->

set p_out=2;

-> select p_out;

-> end

->

//mysql> delimiter ;

mysql>

set @p_out=1;

mysql> call out_param

(@p_out);+

-------

+| p_out |+--

-----+

|null|+

-------

+  #因為out是向呼叫者輸出引數,不接收輸入的引數,所以儲存過程裡的p_out為null+--

-----+

| p_out |+--

-----+

|2|+

-------

+ mysql> select @p_out;+--

------+

| @p_out |+--

------+

|2|+

----

----

+  #呼叫了out_param儲存過程,輸出引數,改變了p_out變數的值

inout輸入輸出引數:

mysql> delimiter $$

mysql> create procedure inout_param

(inout p_inout int)

-> begin

-> select p_inout;

->

set p_inout=2;

-> select p_inout;

-> end

-> $$

mysql> delimiter ;

mysql>

set @p_inout=1;

mysql> call inout_param

(@p_inout);+

----

-----+

| p_inout |+--

-------

+|1|

+---------

++----

-----+

| p_inout |+--

-------

+|2|

+---------

+ mysql> select @p_inout;+--

----

----

+| @p_inout |+--

----

----+|

2|+--

----

----

+#呼叫了inout_param儲存過程,接受了輸入的引數,也輸出引數,改變了變數

注:1、沒有引數時,呼叫時也要加() 即: call sp_name()

2、確保引數的名字不等於列的名字,否則在過程體中,引數名被當做列名來處理。

檢視所有儲存過程

show procedure status;
檢視儲存過程內容

show create procedure 儲存過程名字;
刪除

drop procedure  if exits sp_name
修改

alter

procedure sp_name

sqlsecurity

invoker

;comment

"simon"

MySQL儲存過程詳解 mysql 儲存過程

儲存過程簡介 我們常用的運算元據庫語言sql語句在執行的時候需要要先編譯,然後執行,而儲存過程 stored procedure 是一組為了完成特定功能的sql語句集,經編譯後儲存在資料庫中,使用者通過指定儲存過程的名字並給定引數 如果該儲存過程帶有引數 來呼叫執行它。乙個儲存過程是乙個可程式設計的...

MySql儲存過程詳解

sql語句需要先編譯然後執行,而儲存過程是一組為了完成特定功能的sql語句集,經編譯後儲存在資料庫中,使用者通過指定儲存過程的名字並給定引數 如果該儲存過程帶有引數 來呼叫它。儲存過程是可程式設計的函式,在資料庫中建立並儲存,可以由sql語句和控制結構組成。當想要在不同的應用程式或平台上執行相同的函...

MySQL儲存過程詳解

我們常用的運算元據庫語言sql語句在執行的時候需要要先編譯,然後執行,而儲存過程 stored procedure 是一組為了完成特定功能的sql語句集,經編譯後儲存在資料庫中,使用者通過指定儲存過程的名字並給定引數 如果該儲存過程帶有引數 來呼叫執行它。乙個儲存過程是乙個可程式設計的函式,它在資料...