MySQL存儲過程(PROCEDURE)(一)


一、定義與目的:

  定義:存儲過程是數據庫 SQL 語言層面的代碼封裝與重用(是數據庫中存儲復雜程序,以便外部程序調用的一種數據庫對象);

  目的:我們為了完成特定功能的SQL語句集,經編譯創建並保存在數據庫中,用戶可通過指定存儲過程的名字並給定參數(需要時)來調用執行;

二、存儲過程的特點:

  1. 存儲過程可封裝,並隱藏復雜的商業邏輯。
  2. 存儲過程可以回傳值,並可以接受參數。
  3. 存儲過程無法使用 SELECT 指令來運行,因為它是子程序,與查看表,數據表或用戶定義函數不同。
  4. 存儲過程可以用在數據檢驗,強制實行商業邏輯等。

三、創建存儲過程:

 1 DELIMITER $$  -- 修改 分隔符為 &&
 2 
 3 CREATE
 4     /*[DEFINER = { user | CURRENT_USER }]*/  -- 定義誰有權限來執行、 DEFINER 表示按定義者擁有的權限來執行 、INVOKER 表示用調用者的權限來執行
 5     PROCEDURE `xx_database`.`p_test`()  -- 過程名([[IN|OUT|INOUT] 參數名 數據類型[,[IN|OUT|INOUT] 參數名 數據類型…]]) [特性 ...] 過程體
 6     /*LANGUAGE SQL
 7     | [NOT] DETERMINISTIC
 8     | { CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA }
 9     | SQL SECURITY { DEFINER | INVOKER }
10     | COMMENT 'string'*/
11     BEGIN
12 
13     END$$
14 
15 DELIMITER ;

 四、參數:

  存儲過程中存在三種參數:輸入、輸出、輸入輸出:

IN:參數的值必須在調用存儲過程時指定,在存儲過程中修改該參數的值不能被返回,為默認值

OUT:該值可在存儲過程內部被改變,並可返回

INOUT:調用時指定,並且可被改變和返回

示例:

 1 -- IN 型參數:
 2 DELIMITER &&
 3     create procedure p_test(IN p_id int)
 4         begin
 5             select p_id;
 6             set p_id = 22;    -- 將 p_id 賦值為 22 
 7             select p_id;
 8         end&&
 9 DELIMITER ;
10 
11 -- OUT 型參數:
12 DELIMITER &&
13     create procedure p_test(OUT p_id int)
14         begin
15             select p_id;
16             set p_id = 22;    -- 將 p_id 賦值為 22 
17             select p_id;
18         end&&
19 DELIMITER ;
20 
21 -- INOUT 型參數:
22 DELIMITER &&
23     create procedure p_test(INTOUT p_id int)
24         begin
25             select p_id;
26             set p_id = 22;    -- 將 p_id 賦值為 22 
27             select p_id;
28         end&&
29 DELIMITER ;
30 
31 -- 調用 p_test()
32 set @P_id = 100;   -- @p_id 為用戶變量,用戶可以在后面的代碼里引用它
33 call p_test(@p_id); -- 存儲過程的調用 34 select @p_id;  -- IN型不會影響@p_id 的值,而OUT、INOUT會將@p_id的值改變,具體數值有過程體來定

五、變量的定義:

   1 DECLARE 變量名1[,變量名2...] 數據類型 [默認值]; 

  數值型:

  

  日期、時間類型:

  

  字符串類型:

  

 六、存儲過程的修改:

1 ALTER PROCEDURE sp_name 
2 [{ CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA }
3   | SQL SECURITY { DEFINER | INVOKER }
4   | COMMENT 'string']

  名詞解釋:

sp_name:參數表示存儲過程或函數的名稱;

characteristic:參數指定存儲函數的特性。

CONTAINS SQL:表示子程序包含SQL語句,但不包含讀或寫數據的語句;

NO SQL:表示子程序中不包含SQL語句;

READS SQL DATA:表示子程序中包含讀數據的語句;

MODIFIES SQL DATA:表示子程序中包含寫數據的語句。

SQL SECURITY { DEFINER | INVOKER }:指明誰有權限來執行,DEFINER:表示只有定義者自己才能夠執行;INVOKER:表示調用者可以執行。

COMMENT 'string':是注釋信息。

   示例:

ALTER  PROCEDURE  CountProc  
MODIFIES SQL DATA
SQL SECURITY INVOKER ;

  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM