自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

MySQL數(shù)據(jù)庫之存儲過程的創(chuàng)建和調(diào)用

數(shù)據(jù)庫 MySQL
存儲過程(Stored Procedure)是一種在數(shù)據(jù)庫中存儲復雜程序,以便外部程序調(diào)用的一種數(shù)據(jù)庫對象。

MySQL數(shù)據(jù)庫之存儲過程的創(chuàng)建和調(diào)用

MySQL 5.0 版本開始支持存儲過程。

存儲過程(Stored Procedure)是一種在數(shù)據(jù)庫中存儲復雜程序,以便外部程序調(diào)用的一種數(shù)據(jù)庫對象。

存儲過程是為了完成特定功能的SQL語句集,經(jīng)編譯創(chuàng)建并保存在數(shù)據(jù)庫中,用戶可通過指定存儲過程的名字并給定參數(shù)(需要時)來調(diào)用執(zhí)行。

存儲過程思想上很簡單,就是數(shù)據(jù)庫 SQL 語言層面的代碼封裝與重用。

優(yōu)點

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

缺點

  •  存儲過程,往往定制化于特定的數(shù)據(jù)庫上,因為支持的編程語言不同。當切換到其他廠商的數(shù)據(jù)庫系統(tǒng)時,需要重寫原有的存儲過程。
  •  存儲過程的性能調(diào)校與撰寫,受限于各種數(shù)據(jù)庫系統(tǒng)。

存儲過程的創(chuàng)建和調(diào)用

創(chuàng)建存儲過程 

  1. CREATE  
  2.  [DEFINER = { user | CURRENT_USER }]  
  3.  PROCEDURE sp_name ([proc_parameter[,...]])  
  4.  [characteristic ...] routine_body   
  5. proc_parameter:  
  6.  [ IN | OUT | INOUT ] param_name type   
  7. characteristic:  
  8.  COMMENT 'string'  
  9.  | LANGUAGE SQL  
  10.  | [NOT] DETERMINISTIC  
  11.  | { CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA }  
  12.  | SQL SECURITY { DEFINER | INVOKER }   
  13. routine_body:  
  14.   Valid SQL routine statement   
  15. [begin_label:] BEGIN  
  16.   [statement_list]  
  17.     ……  
  18. END [end_label] 

MYSQL 存儲過程中的關(guān)鍵語法

1.聲明語句結(jié)束符,可以自定義: 

  1. DELIMITER $$  
  2. 或  
  3. DELIMITER // 

2.聲明存儲過程: 

  1. CREATE PROCEDURE demo_in_parameter(IN p_in int)  

3.存儲過程開始和結(jié)束符號: 

  1. BEGIN .... END  

4.變量賦值: 

  1. SET @p_in=1  

5.變量定義: 

  1. DECLARE l_int int unsigned default 4000000;  

6.創(chuàng)建mysql存儲過程、存儲函數(shù): 

  1. create procedure 存儲過程名(參數(shù)) 

7.存儲過程體: 

  1. create function 存儲函數(shù)名(參數(shù)) 

實例

1.創(chuàng)建數(shù)據(jù)庫,備份數(shù)據(jù)表用于示例操作: 

  1. mysql> create database db1;  
  2. mysql> use db1;   
  3. mysql> create table PLAYERS as select * from TENNIS.PLAYERS;  
  4. mysql> create table MATCHES as select * from TENNIS.MATCHES; 

2.下面是存儲過程的例子,刪除給定球員參加的所有比賽: 

  1. mysql> delimiter $$  #將語句的結(jié)束符號從分號;臨時改為兩個$$(可以是自定義)  
  2. mysql> CREATE PROCEDURE delete_matches(IN p_playerno INTEGER)  
  3.  -> BEGIN  
  4.  ->   DELETE FROM MATCHES  
  5.  -> WHERE playerno = p_playerno;  
  6.  -> END$$  
  7. Query OK, 0 rows affected (0.01 sec)  
  8. mysql> delimiter;  #將語句的結(jié)束符號恢復為分號 

解析:默認情況下,存儲過程和默認數(shù)據(jù)庫相關(guān)聯(lián),如果想指定存儲過程創(chuàng)建在某個特定的數(shù)據(jù)庫下,那么在過程名前面加數(shù)據(jù)庫名做前綴。 在定義過程時,使用 DELIMITER $$ 命令將語句的結(jié)束符號從分號 ; 臨時改為兩個 $$,使得過程體中使用的分號被直接傳遞到服務器,而不會被客戶端(如mysql)解釋。

調(diào)用存儲過程: 

  1. call sp_name[(傳參)];  
  1. mysql> select * from MATCHES;  
  2. +---------+--------+----------+-----+------+  
  3. | MATCHNO | TEAMNO | PLAYERNO | WON | LOST |  
  4. +---------+--------+----------+-----+------+  
  5. | 1 | 1 | 6 | 3 | 1 |  
  6. | 7 | 1 | 57 | 3 | 0 |  
  7. | 8 | 1 | 8 | 0 | 3 |  
  8. | 9 | 2 | 27 | 3 | 2 |  
  9. | 11 | 2 | 112 | 2 | 3 |  
  10. +---------+--------+----------+-----+------+  
  11. 5 rows in set (0.00 sec)  
  12. mysql> call delete_matches(57);  
  13. Query OK, 1 row affected (0.03 sec)  
  14. mysql> select * from MATCHES;  
  15. +---------+--------+----------+-----+------+  
  16. | MATCHNO | TEAMNO | PLAYERNO | WON | LOST |  
  17. +---------+--------+----------+-----+------+  
  18. | 1 | 1 | 6 | 3 | 1 |  
  19. | 8 | 1 | 8 | 0 | 3 |  
  20. | 9 | 2 | 27 | 3 | 2 |  
  21. | 11 | 2 | 112 | 2 | 3 |  
  22. +---------+--------+----------+-----+------+  
  23. 4 rows in set (0.00 sec) 

解析:在存儲過程中設置了需要傳參的變量p_playerno,調(diào)用存儲過程的時候,通過傳參將57賦值給p_playerno,然后進行存儲過程里的SQL操作。

存儲過程體

  •  存儲過程體包含了在過程調(diào)用時必須執(zhí)行的語句,例如:dml、ddl語句,if-then-else和while-do語句、聲明變量的declare語句等
  •  過程體格式:以begin開始,以end結(jié)束(可嵌套) 
  1. BEGIN  
  2.   BEGIN  
  3.     BEGIN  
  4.       statements;   
  5.     END  
  6.   END  
  7. END 

注意:每個嵌套塊及其中的每條語句,必須以分號結(jié)束,表示過程體結(jié)束的begin-end塊(又叫做復合語句compound statement),則不需要分號。

為語句塊貼標簽: 

  1. [begin_label:] BEGIN  
  2.   [statement_list]  
  3. END [end_label] 

例如: 

  1. label1: BEGIN  
  2.   label2: BEGIN  
  3.     label3: BEGIN  
  4.       statements;   
  5.     END label3 ;  
  6.   END label2;  
  7. END label1 

標簽有兩個作用:

    1、增強代碼的可讀性

    2、在某些語句(例如:leave和iterate語句),需要用到標簽

 

責任編輯:龐桂玉 來源: 今日頭條
相關(guān)推薦

2011-07-19 15:18:46

存儲過程sql語句

2019-06-20 15:25:14

MySQLL數(shù)據(jù)庫存儲

2019-08-27 15:00:09

MySQL數(shù)據(jù)庫存儲

2009-09-11 15:12:26

LINQ執(zhí)行存儲過程

2010-10-14 13:18:55

MySQL存儲過程

2011-07-04 11:38:06

MySQL

2009-03-06 10:11:30

2011-07-19 17:06:33

Oracle數(shù)據(jù)庫自動增長列

2011-07-21 16:28:20

MySQL數(shù)據(jù)庫帶游標的存儲過程

2010-10-26 14:40:31

oracle存儲過程

2010-10-09 16:26:59

mysql存儲過程

2010-05-19 14:03:41

MySQL 存儲過程

2011-08-10 17:00:45

DB2數(shù)據(jù)庫存儲過程

2010-11-19 10:38:26

Oracle XE自帶

2010-10-09 17:08:15

MySQL存儲過程

2009-01-19 08:59:04

PHP調(diào)用MySQL存儲過程MySQLi擴展

2023-12-19 09:36:35

PostgreSQL數(shù)據(jù)庫開源

2010-06-07 15:36:36

MySQL存儲過程

2010-10-26 14:27:30

oracle存儲過程

2011-06-03 10:50:27

Java
點贊
收藏

51CTO技術(shù)棧公眾號