MySQL的存儲過程蠻啰嗦的,與MSSQL或者Oracle的存儲過程相比,如果沒有顯式指定,他會隱含地指定一系列特性(characteristic)的預設值來創建存儲過程 通常在使用圖形界面工具進行存儲過程編寫的時候,圖形界面工具會自動加上這部分內容比,如用HeidiSQL創建存儲過程的時候,會自動 ...
MySQL的存儲過程蠻啰嗦的,與MSSQL或者Oracle的存儲過程相比,如果沒有顯式指定,他會隱含地指定一系列特性(characteristic)的預設值來創建存儲過程
通常在使用圖形界面工具進行存儲過程編寫的時候,圖形界面工具會自動加上這部分內容比,
如用HeidiSQL創建存儲過程的時候,會自動生成這些特性(characteristic)的預設值。
但是這些特性究竟是幹啥的,有什麼影響,一直沒有怎麼弄清楚。
LANGUAGE SQL
存儲過程語言,預設是sql,說明存儲過程中使用的是sql語言編寫的,暫時只支持sql,後續可能會支持其他語言
NOT DETERMINISTIC
是否確定性的輸入就是確定性的輸出,預設是NOT DETERMINISTIC,只對於同樣的輸入,輸出也是一樣的,當前這個值還沒有使用
CONTAINS SQL
提供子程式使用數據的內在信息,這些特征值目前提供給伺服器,並沒有根據這些特征值來約束過程實際使用數據的情況,說白了就是沒有使用的
包括以下四種選擇
1.CONTAINS SQL表示子程式不包含讀或者寫數據的語句
2.NO SQL 表示子程式不包含sql
3.READS SQL DATA 表示子程式包含讀數據的語句,但是不包含寫數據的語句
4.MODIFIES SQL DATA 表示子程式包含寫數據的語句。
SQL SECURITY DEFINER
用來指定存儲過程是使用創建者的許可來執行,還是執行者的許可來執行,預設值是DEFINER
DEFINER 創建者的身份來調用,對於當前用戶來說:如果執行存儲過程的許可權,且創建者有訪問表的許可權,當前用戶可以成功執行過程的調用的
說白了就是當前用戶調用存儲過程,存儲過程執行的具體操作是藉助定義存儲過程的user的許可權執行的。
INVOKER 調用者的身份來執行,對於當前用戶來說:如果執行存儲過程的許可權,以當前身份去訪問表,如果當前身份沒有訪問表的許可權,即便是有執行過程的許可權,仍然是無法成功執行過程的調用的。
說白了就是當前用戶調用存儲過程,只有當前用戶有執行存儲過程中涉及的對象的操作的許可權的時候,才能成功執行。
COMMENT ''
存儲過程的註釋性信息寫在COMMENT裡面,這裡只能是單行文本,多行文本會被移除到回車換行等,一個字:扯
為什麼說這個扯淡呢?
通常情況下,樓主會註釋一個調用存儲過程的示例在備註里,以免自己活著別人在調試的時候,參數很多的時候,可以很快調用起來,麻煩寫半天參數之類的
-- 因此就會存在類似如下的註釋,但是註釋中的語句會被全部保存成一行,格式給抹掉了
/*
set @p_parameter1 = 'abc';
set @p_parameter2 = 200;
call mysql_procedure(@p_parameyter1,@p_parameter2)
*/
以下是一個存儲過程的demo,delimiter 僅僅是讓存儲過程知道,遇到delimiter定義的字元的時候是結束的標記。
話說MySQL不支持匿名塊就算了,定義存儲過程的時候,什麼時候結束他自己都解析不出來?
delimiter KKKKKKKK(當然是fuck也行) CREATE DEFINER=`root`@`%` PROCEDURE `porcedureName`(in p_parameter1 varchar(200),in p_parameter2 int,out p_outparameter int) -- 存儲過程語言,預設是sql,說明存儲過程中使用的是sql語言編寫的,暫時只支持sql,後續可能會支持其他語言 LANGUAGE SQL -- 是否確定性的輸入就是確定性的輸出,預設是NOT DETERMINISTIC,只對於同樣的輸入,輸出也是一樣的,當前這個值還沒有使用 NOT DETERMINISTIC -- 提供子程式使用數據的內在信息,這些特征值目前提供給伺服器,並沒有根據這些特征值來約束過程實際使用數據的情況,說白了就是沒有使用的 -- ONTAINS SQL表示子程式不包含讀或者寫數據的語句 -- NO SQL 表示子程式不包含sql -- READS SQL DATA 表示子程式包含讀數據的語句,但是不包含寫數據的語句 -- MODIFIES SQL DATA 表示子程式包含寫數據的語句 CONTAINS SQL -- 用來指定存儲過程是使用創建者的許可來執行,還是執行者的許可來執行,預設值是DEFINER -- DEFINER 創建者的身份來調用,如果創建者有許可權訪問存儲過程中的表,調用者有執行過程的許可權,就可以執行 -- INVOKER 調用者的身份來執行,取決於調用是否有執行過程+執行過程中sql語句對應的許可權 SQL SECURITY DEFINER -- 存儲過程的註釋性信息寫在COMMENT裡面,這裡只能是單行文本,多行文本會被移除到回車換行等,一個字:扯 -- 為什麼說這個扯淡呢? -- 通常情況下,樓主會註釋一個調用存儲過程的示例在備註里,以免自己活著別人在調試的時候,參數很多的時候,調用起來,麻煩寫半天參數之類的 -- 因此就會存在類似如下的註釋,但是註釋中的語句會被全部保存成一行,格式給抹掉了 /* set @p_parameter1 = 'abc'; set @p_parameter2 = 200; call mysql_procedure(@p_parameyter1,@p_parameter2) */ COMMENT '' begin select * from user where id = 100; end KKKKKKKK(delimiter是fuck的話,這裡就是fuck了,結尾的標記而已)
參考:《深入淺出MySQL》