我把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錯誤來結束周遊。