存儲過程和函數
存儲過程和函數語法以及調用
存儲過程(Stored Procedure)是在大型數據庫系統中,一組為了完成特定功能的SQL 語句集,存儲在數據庫中,經過第一次編譯後調用不需要再次編譯,用戶通過指定存儲過程的名
字並給出參數(如果該存儲過程帶有參數)來執行它。存儲過程是數據庫中的一個重要對象
一、創建存儲過程和函數
1、創建存儲過程
MySQL中創建存儲過程的語句是create procedure語句,使用call語句調用存儲過程。存儲過程也可以調用其它存儲過程。
語法:
create procedure sp_name([proc_parameter]) [characteristics...] routine_body
create procedure用來創建存儲過程的關鍵字。sp_name是存儲過程名稱,proc_parameter為存儲過程參數列表。列表形式如下:
[IN | OUT | OUT] param_name type
IN表示入參,OUT表示出參,INOUT表示既可以入參也可以出參。param_name表示參數名稱,type表示參數類型。
characteristics指定存儲的過程的特性,有以下幾種取值:
(1)、LANGUAGE SQL:說明routine_body部分由SQL組成,當前系統支持的語言為SQL。SQL是LANGUAGE特性的唯一值
(2)、[NOT] DETERMINITIC:指明存儲過程的結果是否確定,DETERMINITIC表示結果確定的。每次執行存儲過程,相同的輸入得到相同的輸出。NOT DETERMINITIC表示結果 不確定的,相同的輸出可能不同的輸出,默認為NOT DETERMINITIC。
(3)、{CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA}:指明子程序使用SQL的限制。CONTAINS SQL表明子程序包含SQL語句,但是不包含讀寫數據的 語句。NO SQL表名子程序不包含SQL語句。READS SQL DATA表名子程序包含讀數據的語句。MODIFIES SQL DATA表明子程序包含寫數據的語句。默認情況下,系統指 定默認值CONTAINS SQL。
(4)、SQL SECURITY{DEFINER | INVOKER}:指明誰有執行權限。DEFINER表示定義著可以執行,INVOKER表示有權限的調用者也可以執行。默認值是DEFINER。
(5)、COMMENT ‘string‘:註釋信息,用來描述存儲過程和函數
routine_body是SQL代碼的內容。可以用BEGIN........END來表示SQL代碼的開始和技術
例子:
create procedure test() begin select * from student; end;
2、創建函數
創建函數需要用到CREATE FUNCTION關鍵字。基本語法格式如下:
create function func_name([proc_parameter]) returns type [characteristics...] routine_body
create function是創建函數的關鍵字,func_name是函數名。proc_parameter是參數,有IN OUT INOUT三種,characteristics表示函數的特性,和存儲過程一樣,不再重復敘述。RETURNS type表示函數返回數據的類型。
例子:
create function test_func() returns char(50) return (select b from student where a = 1); select test_func() # 調用函數
如果return語句返回值的類型不同於returns子句指定類型的值,返回值被強制為恰當的類型。
3、變量的使用
變量可以在子程序中聲明並使用,這些變量的作用範圍是BEGIN.....END程序中。
(1)、變量的定義
DECLARE var_name [, var_name].. data_type [DEFAULT value]
var_name 是局部變量的名稱,DEFALULT給變量一個默認值。值除了可以給常數,還可以給一個表達式。如果沒有默認值,則值為NULL
(2)、為變量賦值
定義變量後,為變量賦值可以改變變量的默認值。MySQL使用set語句為變量賦值。語法格式如下:
SET var_name = expr [,var_name = expr]....
MySQL還可以通過select....into.為變量復制
select colname[,....] into var_name[,....] table_expr
4、定義條件和處理程序
存儲過程和函數