天天看點

mysql 保護存儲過程_mysql存儲過程

Life is not what you have gained but what you have done!

SQL語句首先需要編譯,然後才運作,而存儲過程是為了完成某一功能的SQL集,經編譯後存儲在資料庫中,使用者通過指定存儲過程的名字并給定參數來調用它。

存儲語句是可程式設計的函數,在資料庫中建立并儲存,有SQL語句和控制語句組成,資料庫中的存儲過程可以看做是對面向對象的模拟,它允許控制資料的通路方式。

優點:

可以完成複雜的判斷和計算

标準元件式程式設計,存儲過程被建立後,可以被多次調用,而不必重新編寫該存儲過程的SQL語句

較快的執行速度,如果某一操作包含大量的transaction—SQL代碼或被多次執行,那麼存儲過程比批處理運作速度快很多,因為存儲過程是預編譯的,在首次運作存儲過程時,優化器對其進行優化加速,并給出最終存儲在系統表中的執行計劃,而批處理每次都要進行編譯優化速度慢些。

減少網絡流量,針對同一個資料庫對象的操作,如果這一操作所涉及的transaction-SQL語句被存儲到存儲過程,那麼客戶調用該存儲過程時,隻需要傳輸該調用語句,大大減少了網絡傳輸負荷。

create procedure sp_name([proc_parameter,...])

[characteristic] routine_body

sp_name存儲過程的名字,預設在目前資料庫建立

proc_parameter:存儲過程的參數清單,格式:IN/OUT/INOUT param_name type

param_name為參數名,type為參數的資料類型。多個參數間用逗号隔開。輸入參數,輸出參數,和輸入輸出參數分别用in,out,inout辨別。

characteristic:存儲過程的某些特征設定

comment string:用于對存儲過程的描述,String為描述内容,comment為關鍵字

language SQL:指明編寫這個存儲過程的語言為SQL語言

deterministic:表示存儲過程對同樣參數産生相同的結果,Nodeterministic表示産生不确定的結果(預設)

contains sql| no sql |reads sql data|modifies sql data contains sql 表示存儲過程包含讀或寫資料的語句

No SQL表示不包含SQL語句

reads SQL data表示存儲過程隻包含讀資料語句

modifies sql data表示存儲過程隻包含寫資料的語句

SQL security:這個特征用來指定存儲過程使用建立該存儲過程的使用者的許可來執行還是使用調用者的許可來執行

routine_body:存儲過程的主體,包含在過程調用的時候必須執行的SQL語句,以begin開始,end結束,如果存儲過程隻有一條SQL則可以省略begin-end标志

create procedure sp_search(in p_name char(20))

begin

if p_name is null or p_name = "" then

select * from t_user;

else

select * from t_user where user_name like = p_name;

end if;

end//

調用并輸出結果:call sp_search("小明");

帶out的存儲過程

create procedure sp_search2(in p_name char(20),out p_int int)

begin

if p_name is null or p_name = "" then

select * from t_user;

else

select * from t_user where user_name like p_name;

end if;

select Found_rows() into p_int;

end//

調用輸出:統計帶林開頭的人數

call sp_search2("林%",@p_num);

select @p_num;

帶inout的存儲過程

create procedure sp_inout(inout p_num int)

begin

set p_num = p_num*10;

end;

//調用并輸出結果:set @p_num=2;

call sp_inout(@p_num);

select @p_num;

存儲過程體可以使用SQL語句和存儲過程

局部變量:

DECLARE var_name[,…] type [DEFAULT value]

Declare cidint(10);

使用說明:

局部變量隻能在存儲過程體的begin…end語句塊中聲明。

局部變量必須在存儲過程體的開頭處聲明。

局部變量的作用範圍僅限于聲明它的begin..end語句塊,其他語句塊中的語句不可以使用它。

局部變量不同于使用者變量,兩者差別:局部變量聲明時,在其前面沒有使用@符号,并且它隻能在begin..end語句塊中使用;而使用者變量在聲明時,會在其名稱前面使用@符号,同時已聲明的使用者變量存在于整個會話之中。

2、set語句

使用set語句為局部變量指派

Set var_name=expr

Set cid=910;

3、select … into 語句

把標明列的值直接存儲到局部變量中,文法格式

說明:存儲過程體中的select…into語句傳回的結果集隻能有一行資料。

4、定義處理程式是事先定義程式執行過程中可能遇到的問題。并且可以在處理程式中定義解決這些問題的辦法。這種方式可以提前預測可能出現的問題,并提出解決方法。

5、流程控制語句(1)條件判斷語句

If語句

Search_condition參數:條件判斷語句

Statement_list參數:不同條件的執行語句

多重IF的存儲過程執行個體

資料準備

學生表:

資料如下:

mysql 保護存儲過程_mysql存儲過程

成績表(STU_ID是學生表是外鍵關系):

mysql 保護存儲過程_mysql存儲過程

然後寫一個存儲過程:傳回各個分數等級的人

調用過程:

mysql 保護存儲過程_mysql存儲過程

Case 語句

表達形式1

表達形式2

使用範例

調用:

mysql 保護存儲過程_mysql存儲過程

(2)循環語句While語句、repeat語句和loop語句。

While語句

判斷條件search_condition是否為真,若為真,則執行statement_list中的語句,然後再進行判斷,如若仍然為真則繼續循環,直至條件判斷不為真時循環結束。

使用範例

輸出結果:計算5!

mysql 保護存儲過程_mysql存儲過程

Repeat語句文法格式

Repeat語句首先執行statement_list中的語句,然後判斷條件search_condition是否為真,倘若為真,則結束循環,若不為真,繼續循環。

Repeat先執行後判斷,while先判斷後執行。

使用範例:

mysql 保護存儲過程_mysql存儲過程

1.5、 調用存儲過程

1.6、 修改存儲過程

複制代碼代碼如下:

Alter procedure proc_name[characteristic…]

隻能修改存儲過程的特征,如果要修改存儲過程的内容,可以先删除該存儲過程,然後再重新建立

1.7、 删除存儲過程

複制代碼代碼如下:

Drop procedure [if exists] sp_name;

二、函數2.1、 定義

子句用于聲明存儲函數傳回值的資料類型。存儲過程是使用者定義的一系列sql語句的集合,涉及特定表或其它對象的任務,使用者可以調用存儲過程,而函數通常是資料庫已定義的方法,它接收參數并傳回某種類型的值并且不涉及特定使用者表。

調用存儲函數

删除存儲函數drop

修改存儲函數alter 修改存儲函數的某些相關特征。

2.2、函數使用例子

(比較大小 ,傳回大的數)

調用:

mysql 保護存儲過程_mysql存儲過程

2.3、存儲過程和函數差別

1)一般來說,存儲過程實作的功能要複雜一點,而函數的實作的功能針對性比較強。存儲過程,功能強大,可以執行包括修改表等一系列資料庫操作;使用者定義函數不能用于執行一組修改全局資料庫狀态的操作。

2)對于存儲過程來說可以傳回參數,如記錄集,而函數隻能傳回值或者表對象。函數隻能傳回一個變量;而存儲過程可以傳回多個。存儲過程的參數可以有IN,OUT,INOUT三種類型,而函數隻能有IN類~~存儲過程聲明時不需要傳回類型,而函數聲明時需要描述傳回類型,且函數體中必須包含一個有效的RETURN語句。

3)存儲過程,可以使用非确定函數,不允許在使用者定義函數主體中内置非确定函數。

4)存儲過程一般是作為一個獨立的部分來執行( EXECUTE 語句執行),而函數可以作為查詢語句的一個部分來調用(SELECT調用),由于函數可以傳回一個表對象,是以它可以在查詢語句中位于FROM關鍵字的後面。 SQL語句中不可用存儲過程,而可以使用函數。

三、光标(遊标)

3.1 定義     查詢語句可能查詢出多條記錄,在存儲過程和函數中使用光标标來逐條讀取查詢結果集中的記錄。光标的使用包括聲明光标、打開光标、使用光标和關閉光标。光标必須聲明光标、打開光标、使用光标和關閉光标。光标必須聲明在處理程式之前,并且聲明在變量和條件之後。

1 聲明光标

2 打開光标

3 使用光标

Mysql中使用fetch關鍵字來使用光标,文法形式

4 關閉光标

每個光标不再需要時都應該被關閉,使用close語句将會釋放光标所使用的全部資源。在一個光标被關閉後,如果沒有重新被打開,則不能被使用。對于聲明過的光标,則不需要再次聲明,可直接使用open語句打開。

3.2、使用範例(将表test_cur1資料複制到test_cur2)

然後寫光标了:

運作:

來看看兩張表的資料:這是表2

mysql 保護存儲過程_mysql存儲過程

這是表1

mysql 保護存儲過程_mysql存儲過程

說明資料已成功複制過去了。