儲存過程(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語句集,經編譯後儲存在資料庫中,使用者通過指定儲存過程的名字並給定引數 如果該儲存過程帶有引數 來呼叫執行它。乙個儲存過程是乙個可程式設計的函式,它在資料...