1. 程式人生 > >Mysql 存儲過程實例詳解

Mysql 存儲過程實例詳解

ima 這一 har odi cat image 來講 過程 相同

存儲過程和函數是事先經過編譯並存儲在數據庫中的一段SQL語句的集合,存儲和和函數的區別在於函數必須有返回值,而存儲過程沒有,存儲過程的參數可以使用IN、OUT、INOUT類型,而函數的參數只能是IN類型。存儲過程再簡單點來說,就是為以後的使用而保存的一條或多條MySQL語句的集合。可將其視為批件,雖然它們的作用不僅限於批處理。在我看來, 存儲過程就是有業務邏輯和流程的集合, 可以在存儲過程中創建表,更新數據, 刪除等等。本次博客就來講一下存儲過程

存儲過程的操作

語法如下:

創建:
CREATE PROCEDURE sp_name([proc_parameter[,...]])
    [characteristic...
] routine_body proc_parameter: [IN|OUT|INOUT] param_name type #type: Any valid MySQL data type characteristic: LANGUAGE SQL |[NOT] DETERMINISTIC|{CONTAINS SQL|NO SQL|READS SQL DATA|MODIFIES SQL DATA}|SQL SECURITY {DEFINAER|INVOKER}|COMMENT string routine_body: Valid SQL procedure statement or
statements 修改: ALTER PROCEDURE sp_name [characteristic...] characteristic: {CONTAINS SQL|NO SQL|READS SQL DATA|MODIFIES SQL DATA}|SQL SECURITY {DEFINAER|INVOKER}|COMMENT string 調用: CALL sp_name([parameter[,...]]) 刪除: DROP PROCEDURE sp_name 查看: show PROCEDURE STATUS [like ‘pattern‘] SHOW CREATE
PROCEDURE sp_name

MySQL的存儲過程和函數中允許包含DDL語句,也允許在存儲過程中執行提交或者回滾,但是存儲過程和函數不允許執行LOAD DATA INFILE語句,存儲過程和函數可以調用其他的過程或者函數。

插入小知識點@:

1.用戶變量:以"@"開始,形式為"@變量名"
用戶變量跟mysql客戶端是綁定的,設置的變量,只對當前用戶使用的客戶端生效。
2.全局變量:定義方式 set GLOBAL 變量名  或者  set @@global.變量名 
對所有客戶端生效,只有具有super權限才可以設置全局變量。

存儲過程簡單來說,就是為以後的使用而保存的一條或多條MySQL語句的集合。可將其視為批件,雖然它們的作用不僅限於批處理。

在我看來, 存儲過程就是有業務邏輯和流程的集合, 可以在存儲過程中創建表,更新數據, 刪除等等。

為什麽要使用存儲過程

  1. 通過把處理封裝在容易使用的單元中,簡化復雜的操作(正如前面例子所述)。
  2. 由於不要求反復建立一系列處理步驟,這保證了數據的完整性。如果所有開發人員和應用程序都使用同一(試驗和測試)存儲過程,則所使用的代碼都是相同的。這一點的延伸就是防止錯誤。需要執行的步驟越多,出錯的可能性就越大。防止錯誤保證了數據的一致性。
  3. 簡化對變動的管理。如果表名、列名或業務邏輯(或別的內容)有變化,只需要更改存儲過程的代碼。使用它的人員甚至不需要知道這些變化。

users表如下:

技術分享

創建存儲過程,傳入性別(男或女),顯示對應性別的用戶id,返回對應性別的人數(我的是在mysql front中操作):

#DELIMITER $$
CREATE PROCEDURE user_procedure(IN sex VARCHAR(2) character set utf8,OUT num INT)
BEGIN
    SELECT  id FROM users WHERE gender=sex;
    SELECT FOUND_ROWS() INTO num;   
END #$$
#DELIMITER ;

如果大家用的navicat版本,應該改成是:

DELIMITER $$
CREATE PROCEDURE user_procedure(IN sex VARCHAR(2) character set utf8,OUT num INT)
BEGIN
    SELECT  id FROM users WHERE gender=sex;
    SELECT FOUND_ROWS() INTO num;   
END $$
DELIMITER ;

上面記得中文字符字段,一定要設置編碼:character set utf8,這裏自己被坑了好久才覺悟過來...

調用

CALL user_procedure(,@num);
select @num;

技術分享

定義條件和處理

條件的定義和處理可以用來定義在處理過程中遇到問題時相應的處理步驟。

語法如下:

條件定義:
DECLARE condition_name CONDITION FOR condition_value

condition_value:
    SQLSTATE [VALUE] sqlstate_value
    |mysql_error_code
條件處理:
DECLARE handler_type HANDLER FOR condition_value[,...] sp_statement

handler_type:
    CONTINUE|EXIT|UNDO

condition_value:
     SQLSTATE [VALUE] sqlstate_value
     |condition_name|SQLWARNING|NOT FOUND|SQLEXCEPTION|mysql_error_code

繼續用users舉個例子吧!
現在有表如下:

技術分享

(1)當沒有進行條件處理的時候:

#delimiter $$
create procedure user_insert()
begin
set @x=1;
insert into users(id,gender,name) values(1,,常貴);
set @x=2;
insert into users(gender,name) values(,大腳);
set @x=3;
END #$$

技術分享

上面的例子可以看出,當插入id=1,主鍵重復了,直接退出了,並沒有執行余下的語句,所以@x的值為1。

技術分享

好吧 ,先寫在這裏吧。。要出去遛娃了哦.....未完待續...

Mysql 存儲過程實例詳解