1. 程式人生 > >存儲過程和函數

存儲過程和函數

數據 定義變量 into fine font 情況 數據庫 uri init

存儲過程和函數語法以及調用

存儲過程(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、定義條件和處理程序

存儲過程和函數