天天看點

MySQL 第八篇:自定義函數、存儲過程、遊标自定義函數存儲過程

我把MySQL的内容整理成9篇部落格,學完這9篇部落格雖不能說能成為大神,但是應付一般中小企業的開發已經足夠了,有疑問或建議的歡迎留言讨論。

函數可以看作是一個加工作坊,這個加工作坊接收調用者傳遞過來的原料(傳遞的參數),然後将這些原料加工處理成産品(函數的傳回值)再把産品傳回給調用者。

定義一個結束辨別符,因為MySQL預設是以分号作為SQL語句的結束符的,而函數體内部要用到分号,是以會跟預設的SQL結束符發生沖突,是以需要先定義一個其他的符号作為SQL的結束符;

create procedure 存儲過程名(參數1,參數2…)

[存儲過程選項]

begin

存儲過程語句塊

end;

說明:

IN 輸入參數:表示該參數的值必須在調用存儲過程時指定,在存儲過程中修改該參數的值不能被傳回,為預設值。

OUT 輸出參數:該值可在存儲過程内部被改變,并可傳回。

INOUT 輸入輸出參數:調用時指定,并且可被改變和傳回。

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

存儲過程和函數存在以下幾個差別:

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

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

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

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

遊标本質上是一種能從select結果集中每次提取一條記錄的機制,是以遊标與select語句息息相關。

1.聲明遊标 declare 遊标名 cursor for select語句。

2.打開遊标 open 遊标名。

3.從遊标中提取資料 fetch 遊标名 into 标量(需配合循環使用)。

4.關閉遊标 close 遊标名稱。

注意:

1.變量名的個數必須與聲明遊标時使用的select語句結果集中的字段個數保持一緻

2.fetch 在執行過程中如果無法提取資料會産生 “ERROR 1329(0200):Nodata to FETCH”,這樣我們可以自定義1329錯誤來結束周遊。