儲存過程和函式是在資料庫中定義一些sql語句的集合,然後直接呼叫這些儲存過程和函式來執行已經定義好的sql語句。儲存過程和函式可以避免開發人員重複的編寫相同的sql語句。而且,儲存過程和函式是在mysql伺服器中儲存和執行的,可以減少客戶端和伺服器端的資料傳輸。
一.建立儲存過程和函式
1. 建立儲存過程
mysql中建立儲存過程的基本形式:
create procedure sp_name([proc_parameter[,…]]) [characteristic…] routine_body;
sp_name:引數是儲存過程的名稱;
proc_parameter:表示儲存過程的引數列表;
characteristic:引數指定儲存過程的特性;
routine_body:引數是sql**的內容,可以用begin…end來標誌sql**的開始和結束;
proc_parameter中每個引數由3部分組成。這3部分分別是輸入輸出型別、引數名稱和引數型別。
[in|out|inout] param_name type
in:表示輸入引數
out:表示輸出引數
inout:表示既可以是輸入也可以是輸出
param_name:引數是儲存過程的引數名稱
type:引數指定儲存過程的引數型別,該型別可以是mysql資料庫的任意資料型別。
characteristic引數有多個取值。取值說明:
language sql:說明routine_body部分是由sql語言的語句組成,這也是資料庫系統預設的語言。
[not] deterministic:指明儲存過程的執行結果是否是確定的。
deterministic:表示結果是確定的,每次執行儲存過程時,相同的輸入會得到相同的輸出。
not deterministic:表示結果是非確定的,相同的輸入可能得到不同的輸出。預設情況下,結果也是非確定的。
:指明子程式使用sql語句的限制。
contains sql:表示子程式包含sql語句,但不包含讀或者寫資料的語句;
no sql:表示子程式中不包含sql語句;
reads sql data:表示子程式中包含讀資料的語句;
modifies sql data:表示子程式中包含寫資料的語句。預設情況下,系統會指定為contains sql。
sql security:指明誰有許可權來執行。
definer:表示只有定義者自己才能執行;
invoker:表示呼叫者可以執行。預設情況下,系統指定的許可權是definer。
comment 『string』:注釋資訊。
注:建立儲存過程時,系統預設指定contains sql,表示儲存過程中使用sql語句,最好設定為no sql。而且,儲存過程中最好在comment部分對儲存過程進行簡單的注釋,以便以後再閱讀儲存過程的**是更加方便。
示例:下面建立乙個名為num_from_employee的儲存過程。
delimiter &&
create procedure num_from_employee(in emp_id int,out count_num int)
reads sql data
begin
select count(*) into count_num
from employee
where d_id=emp_id;
end &&
注:**執行完畢,沒報錯就表示儲存過程建立成功;
說明:mysq中預設的語句結束符為分號(;)。儲存過程中的sql語句需要分號來結束。為避免衝突,首先用」delimiter &&」將mysql的技術符設定為&&。最後再用」delimiter;」來將結束符恢復成分號。
建立儲存函式
mysql中建立儲存函式的語法:
create function sp_name([func_parameter[,…]])
returns type
[characteristic…] routine_body
sp_name:引數是函式的名稱;
func_parameter:表示儲存函式的引數列表;
returns type:指返回值型別;
characteristic:引數指定儲存函式的特性,該引數的取值與儲存過程中取值是一樣的。
routine_body:引數是sql**的內容,可以用begin…end來標誌sql**的開始和結束。
func_parameter:可以由多個引數組成,其中每個引數由引數名稱和引數型別組成,形式:param_name type
其中,param_name 是儲存函式的引數名稱;
type:引數是指定儲存函式的引數型別;
示例:下面建立乙個名為name_from_employee的儲存函式
create function name_from_employee(emp_id int)
returns varchar(20)
begin
return (select name from employee where num=emp_id);
end
儲存函式的名稱:name_from_employee;
函式的引數:emp_id;
返回值是varchar型別;
2. 變數的使用
在儲存過程和函式中,可以定義和使用變數。可以使用declare關鍵字定義變數,然後賦值。變數的作用範圍是begin…and程式段中。
(1) 定義變數
使用declare關鍵字定義變數。語法:
declare var_name[,…] type [default value]
declare:宣告變數;
var_name:引數是變數的名稱(可以同時定義多個變數);
type:指定變數的型別;
default value:子句將變數預設值設定為value,未使用default value時,預設值為null;
示例:declare my_sql int default 10;
(2) 為變數賦值
mysql中set關鍵字為變數賦值。語法:
set var_name = expr[,var_name=expr]…
set:為變數賦值;
var_name:引數是變數的名稱;
expr:引數是賦值表示式;
注:乙個set語句可以同時為多個變數賦值,各個變數的賦值語句之間用逗號(,)隔開。
示例:為變數my_sql賦值為30;
set my_sql=30;
mysql中還可以用select…into…語句為變數賦值。語法:
select col_name[,…] into var_name[,…] from table_name where condition
col_name:引數表示查詢的欄位名稱;
var_char:引數是變數的名稱;
table_name:引數指表的名稱;
condition:引數指查詢條件;
示例:下面從employee表中查詢id為2的記錄。將該記錄的d_id值賦給my_sql變數。
儲存過程和變數
在sql server中,可以定義子程式存放在資料庫中,這樣子程式稱為儲存過程 sql server中支援以下幾種型別的儲存過程 1,系統儲存過程 以 sp 為字首,儲存在master裡面 2,本地儲存過程 儲存在使用者自定義的資料庫中 3,擴充套件儲存過程 以 xp 為字首,儲存在master裡面...
C變數及函式儲存型別
1.變數及函式宣告格式 在c語言中,對於乙個變數的宣告 定義格式如下 儲存型別 型別修飾符 資料型別 變數名 在c語言中,對於乙個函式的宣告格式如下 儲存型別 返回資料型別 函式名 引數列表 2.儲存型別 1 auto 只能用來標識變數的儲存型別,意義為自動型別,標識該區域性變數儲存在正在執行程序棧...
C變數及函式儲存型別
變數及函式宣告格式 在c語言中,對於乙個變數的宣告 定義格式如下 儲存型別 型別修飾 資料型別 變數名 其中 auto儲存型別 auto 只能用來標識變數的儲存型別,意義為自動型別,標識該區域性變數儲存在正在執行的程序棧區域,一般情況,對於區域性變數,auto 為預設的儲存型別,不需要顯示指定。區域...