1. 程式人生 > >MySQL的儲存過程(二)

MySQL的儲存過程(二)

characteristic特徵值:

(1)LANGUAGE SQL:

說明下面過程的BODY是適用SQL語言編寫,這條是系統預設的,為今後MySQL會支援的除SQL外的其他語言支援的儲存過程而準備。

(2) [NOT ] DETERMINISTIC:DETERMINISTIC 確定的,即每次輸入一樣輸出也一樣的程式,NOT DETERMINISTIC 非確定的,預設是非確定的。該關鍵詞只有在高版本中才被優化程式使用。

(3){CONTAINS SQL | NO SQL |READS SQL DATA | MODIFIES  SQL  DATA}:這些特徵值提供子程式使用資料的內在資訊,這些特徵值目前只是提供給伺服器,並沒有根據這些特徵值來約束過程過程實際使用資料的情況。

         CONTAINS  SQL : 表示子程式不包含讀或寫資料的語句

         NO  SQL:表示子程式不包含SQL語句

         READS SQL  DATA:表示子程式包含讀資料的語句,但不包含寫資料的語句。

         MODIFIES  SQL  DATA :表示子程式包含寫資料的語句。

          預設使用的值:CONTAINS  SQL

(4)COMMENT ‘string’ : 儲存過程或者函式的註釋資訊

(4)SQL  SECUTRITY{DEFINER | INVOKER}:

用來指定子程式的使用許可權,DEFINER是建立子程式者的許可來執行,INVOKER 是使用呼叫者的許可來執行。

CREATE PROCEDURE  film_in_stock_definer(

IN p_film_id INT,

IN p_store_id INT,

OUT p_film_count INT)

SQL  SECURITY  DEFINER   #任何使用者呼叫該儲存過程都是以建立者的許可權去查詢

BEGIN

            SELECT inventory_id

            FROM   inventory

            WHERE  film_id=p_film_id

            AND  store_id=p_store_id

            AND  inventory_in_stock(inventory_id)

           SELECT  FOUND_ROWS()  INTO  p_film_count;

END $$

CREATE PROCEDURE  film_in_stock_definer(

IN p_film_id INT,

IN p_store_id INT,

OUT p_film_count INT)

SQL  SECURITY  INVOKER   #以使用者呼叫該儲存過程,是以本身的許可權去查詢,可能被拒絕。

BEGIN

            SELECT inventory_id

            FROM   inventory

            WHERE  film_id=p_film_id

            AND  store_id=p_store_id

            AND  inventory_in_stock(inventory_id)

           SELECT  FOUND_ROWS()  INTO  p_film_count;

END $$

注意:最常用的