成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

MySQL數(shù)據(jù)庫新特性之存儲過程入門教程

數(shù)據(jù)庫 MySQL
在MYSQL 5中,終于引入了存儲過程這一新特性,這將大大增強(qiáng)MYSQL 的數(shù)據(jù)庫處理能力,在本文中,將指導(dǎo)讀者快速掌握MYSQL 5的存儲過程的基本知識,帶領(lǐng)用戶入門。

在MYSQL 5中,終于引入了存儲過程這一新特性,這將大大增強(qiáng)MYSQL 的數(shù)據(jù)庫處理能力,在本文中,將指導(dǎo)讀者快速掌握MYSQL 5的存儲過程的基本知識,帶領(lǐng)用戶入門。

存儲過程介紹

存儲過程是一組為了完成特定功能的SQL語句集,經(jīng)編譯后存儲在數(shù)據(jù)庫中。用戶通過指定存儲過程的名字并給出參數(shù)(如果該存儲過程帶有參數(shù))來執(zhí)行它。存儲過程可由應(yīng)用程序通過一個(gè)調(diào)用來執(zhí)行,而且允許用戶聲明變量 。同時(shí),存儲過程可以接收和輸出參數(shù)、返回執(zhí)行存儲過程的狀態(tài)值,也可以嵌套調(diào)用。

存儲過程的特點(diǎn)

作為存儲過程,有以下這些優(yōu)點(diǎn)

(1)減少網(wǎng)絡(luò)通信量。調(diào)用一個(gè)行數(shù)不多的存儲過程與直接調(diào)用SQL語句的網(wǎng)絡(luò)通信量可能不會有很大的差別,可是如果存儲過程包含上百行SQL語句,那么其性能絕對比一條一條的調(diào)用SQL語句要高得多。

(2)執(zhí)行速度更快。存儲過程創(chuàng)建的時(shí)候,數(shù)據(jù)庫已經(jīng)對其進(jìn)行了一次解析和優(yōu)化。其次,存儲過程一旦執(zhí)行,在內(nèi)存中就會保留一份這個(gè)存儲過程,這樣下次再執(zhí)行同樣的存儲過程時(shí),可以從內(nèi)存中直接中讀取。

(3)更強(qiáng)的安全性。存儲過程是通過向用戶授予權(quán)限(而不是基于表),它們可以提供對特定數(shù)據(jù)的訪問,提高代碼安全,比如防止 SQL注入。

(4) 業(yè)務(wù)邏輯可以封裝存儲過程中,這樣不僅容易維護(hù),而且執(zhí)行效率也高

當(dāng)然存儲過程也有一些缺點(diǎn),比如:

1 可移植性方面:當(dāng)從一種數(shù)據(jù)庫遷移到另外一種數(shù)據(jù)庫時(shí),不少的存儲過程的編寫要進(jìn)行部分修改。

2 存儲過程需要花費(fèi)一定的學(xué)習(xí)時(shí)間去學(xué)習(xí),比如學(xué)習(xí)其語法等。

在MYSQL中,推薦使用MYSQL Query Browswer(http://dev.mysql.com/doc/query-browser/en/)這個(gè)工具去進(jìn)行存儲過程的開發(fā)和管理。

下面分步驟來學(xué)習(xí)MYSQL中的存儲過程。

1 定義存儲過程的結(jié)束符

在存儲過程中,通常要輸入很多SQL語句,而SQL語句中每個(gè)語句以分號來結(jié)束,因此要告訴存儲過程,什么位置是意味著整個(gè)存儲過程結(jié)束,所以我們在編寫存儲過程前,先定義分隔符,我們這里定義“//”為分隔符,我們使用DELIMITER //這樣的語法,就可以定義結(jié)束符了,當(dāng)然你可以自己定義其他喜歡的符號。

2 如何創(chuàng)建存儲過程

下面先看下一個(gè)簡單的例子,代碼如下:

  1. DELIMITER //  
  2. CREATE PROCEDURE `p2` ()  
  3. LANGUAGE SQL  
  4. DETERMINISTIC  
  5. SQL SECURITY DEFINER  
  6. COMMENT 'A procedure' 
  7. BEGIN 
  8.     SELECT 'Hello World !';  
  9. END// 

下面講解下存儲過程的組成部分:

  1)首先在定義好終結(jié)符后,使用CREATE PROCEDURE+存儲過程名的方法創(chuàng)建存儲過程,LANGUAGE選項(xiàng)指定了使用的語言,這里默認(rèn)是使用SQL。

  2)DETERMINISTIC關(guān)鍵詞的作用是,當(dāng)確定每次的存儲過程的輸入和輸出都是相同的內(nèi)容時(shí),可以使用該關(guān)鍵詞,否則默認(rèn)為NOT DETERMINISTIC。

  3) SQL SECURITY關(guān)鍵詞,是表示調(diào)用時(shí)檢查用戶的權(quán)限。當(dāng)值為INVOKER時(shí),表示是用戶調(diào)用該存儲過程時(shí)檢查,默認(rèn)為DEFINER,即創(chuàng)建存儲過程時(shí)檢查。

  4) COMMENT部分是存儲過程的注釋說明部分。

  5)在BEGIN END部分中,是存儲過程的主體部分。

3 調(diào)用存儲過程的方法

調(diào)用存儲過程的方法很簡單,只需要使用call命令即可,后面跟要調(diào)用存儲過程的名稱及輸入的變量列表,比如:

  1. CALL stored_procedure_name (param1, param2, ....)  
  2. CALL procedure1(10 , 'string parameter' , @parameter_var); 

4 修改和刪除存儲過程

可以用ALTER的語法去修改存儲過程的主要特征和參數(shù),要修改其存儲過程的主體部分的話,必須要先刪除然后再重建。比如下面修改存儲過程num_from_employee的定義。將讀寫權(quán)限改為MODIFIES SQL DATA,并指明調(diào)用者可以執(zhí)行。代碼執(zhí)行如下:

  1. ALTER PROCEDURE num_from_employee   
  2. MODIFIES SQL DATA SQL SECURITY INVOKER ; 

而刪除存儲過程的語法為使用DROP關(guān)鍵詞即可。如下

  1. DROP PROCEDURE IF EXISTS p2; 

#p#

5 存儲過程的參數(shù)

下面來學(xué)習(xí)下存儲過程中的參數(shù),先看下存儲過程中的參數(shù)形式,如下:

  1. CREATE PROCEDURE proc1 ()-----這個(gè)存儲過程中是空的參數(shù)列表  
  2.  
  3. CREATE PROCEDURE proc1 (IN varname DATA-TYPE)-----這個(gè)存儲過程中有一個(gè)輸出參數(shù),名稱為varname,后面是跟數(shù)據(jù)類型DATA-TYPE,IN參數(shù)是默認(rèn)的,因此可以省略不寫  
  4.  
  5. CREATE PROCEDURE proc1 (OUT varname DATA-TYPE)-----這個(gè)存儲過程中varname為輸出參數(shù)  
  6.  
  7. CREATE PROCEDURE proc1 (INOUT varname DATA-TYPE)-----這個(gè)存儲過程中,varname既是輸入?yún)?shù)也是輸出參數(shù) 

下面具體看個(gè)例子,首先是IN輸入?yún)?shù)的例子,如下:

  1.   DELIMITER //  
  2.   CREATE PROCEDURE `proc_IN` (IN var1 INT)  
  3.   BEGIN 
  4.   SELECT var1 + 2 AS result;  
  5.   END// 

輸出OUT參數(shù)例子如下:

  1.   DELIMITER //  
  2.   CREATE PROCEDURE `proc_OUT` (OUT var1 VARCHAR(100))  
  3.   BEGIN 
  4.   SET var1 = 'This is a test';  
  5.   END // 

IN-OUT的例子:

  1.   DELIMITER //  
  2.   CREATE PROCEDURE `proc_INOUT` (OUT var1 INT)  
  3.   BEGIN 
  4.   SET var1 = var1 * 2;  
  5.   END // 

6 如何定義變量

下面講解下MYSQL 5存儲過程中,如何定義變量。

必須顯式地在存儲過程的一開始聲明變量,并指出它們的數(shù)據(jù)類型,一但聲明了變量后,就可以在存儲過程中使用,定義變量的語法如下:

  1. DECLARE varname DATA-TYPE DEFAULT defaultvalue 

舉例說明:

  1.   DECLARE a, b INT DEFAULT 5;  
  2.   DECLARE str VARCHAR(50);  
  3.   DECLARE today TIMESTAMP DEFAULT CURRENT_DATE;  
  4.   DECLARE v1, v2, v3 TINYINT; 

一旦定義好變量,就可以在存儲過程中對其進(jìn)行賦初值,并進(jìn)行各類相關(guān)的操作,比如:

  1.   DELIMITER //  
  2.   CREATE PROCEDURE `var_proc` (IN paramstr VARCHAR(20))  
  3.   BEGIN 
  4.   DECLARE a, b INT DEFAULT 5;  
  5.   DECLARE str VARCHAR(50);  
  6.   DECLARE today TIMESTAMP DEFAULT CURRENT_DATE;  
  7.   DECLARE v1, v2, v3 TINYINT;  
  8.   INSERT INTO table1 VALUES (a);  
  9.   SET str = 'I am a string';  
  10.   SELECT CONCAT(str,paramstr), today FROM table2 WHERE b>=5;  
  11.   END // 

#p#

7 MYSQL存儲過程的語法結(jié)構(gòu)

MYSQL存儲過程中支持IF,CASE,ITERATE,LEAVE LOOP,WHILE和REPEAT等語法結(jié)構(gòu)和語句,在本文中,著重介紹IF,CASE和WHILE語法,因?yàn)樗鼈兪褂玫淖顬閺V泛。

IF 語句

if語句使用的是if…then end if的語法結(jié)構(gòu),例子如下:

  1.   DELIMITER //  
  2.   CREATE PROCEDURE `proc_IF` (IN param1 INT)  
  3.   BEGIN 
  4.   DECLARE variable1 INT;  
  5.   SET variable1 = param1 + 1;  
  6.   IF variable1 = 0 THEN 
  7.   SELECT variable1;  
  8.   END IF;  
  9.   IF param1 = 0 THEN 
  10.   SELECT 'Parameter value = 0';  
  11.   ELSE 
  12.   SELECT 'Parameter value <= 0';  
  13.   END IF;  
  14.   END // 

 

CASE語句

當(dāng)有很多IF語句時(shí),就應(yīng)該考慮使用CASE語句了,它是多分支選擇語句,有兩種寫法:

第一種寫法:

  1.   DELIMITER //  
  2.   CREATE PROCEDURE `proc_CASE` (IN param1 INT)  
  3.   BEGIN 
  4.   DECLARE variable1 INT;  
  5.   SET variable1 = param1 + 1;  
  6.   CASE variable1  
  7.   WHEN 0 THEN 
  8.   INSERT INTO table1 VALUES (param1);  
  9.   WHEN 1 THEN 
  10.   INSERT INTO table1 VALUES (variable1);  
  11.   ELSE 
  12.   INSERT INTO table1 VALUES (99);  
  13.   END CASE;  
  14.   END // 

另外一種寫法:

  1.   DELIMITER //  
  2.   CREATE PROCEDURE `proc_CASE` (IN param1 INT)  
  3.   BEGIN 
  4.   DECLARE variable1 INT;  
  5.   SET variable1 = param1 + 1;  
  6.   CASE 
  7.   WHEN variable1 = 0 THEN 
  8.   INSERT INTO table1 VALUES (param1);  
  9.   WHEN variable1 = 1 THEN 
  10.   INSERT INTO table1 VALUES (variable1);  
  11.   ELSE 
  12.   INSERT INTO table1 VALUES (99);  
  13.   END CASE;  
  14.   END // 

WHILE語句

WHILE語句跟普通編程語言中的while語句差不多,例子如下:

  1.   DELIMITER //  
  2.   CREATE PROCEDURE `proc_WHILE` (IN param1 INT)  
  3.   BEGIN 
  4.   DECLARE variable1, variable2 INT;  
  5.   SET variable1 = 0;  
  6.   WHILE variable1   
  7.   INSERT INTO table1 VALUES (param1);  
  8.   SELECT COUNT(*) INTO variable2 FROM table1;  
  9.   SET variable1 = variable1 + 1;  
  10.   END WHILE;  
  11.   END // 

8 MYSQL存儲過程中的游標(biāo)

MYSQL中的游標(biāo)是一個(gè)十分重要的概念。游標(biāo)提供了一種對從表中檢索出的數(shù)據(jù)進(jìn)行操作的靈活手段,就本質(zhì)而言,游標(biāo)實(shí)際上是一種能從包括多條數(shù)據(jù)記錄的結(jié)果集中每次提取一條記錄的機(jī)制。MYSQL中的游標(biāo)的語法如下:

  1.   DECLARE cursor-name CURSOR FOR SELECT ...; /* 聲明一個(gè)游標(biāo),名稱為cursor-name,并用CURSOR FOR SELECT*/  
  2.   DECLARE CONTINUE HANDLER FOR NOT FOUND /*指定當(dāng)遍歷完結(jié)果集后,游標(biāo)如何繼續(xù)處理*/  
  3.   OPEN cursor-name; /*打開游標(biāo) */  
  4.   FETCH cursor-name INTO variable [, variable]; /* 將變量賦值給游標(biāo)*/  
  5.   CLOSE cursor-name; /*使用后關(guān)閉游標(biāo)*/ 

一個(gè)具體的例子如下:

  1.   DELIMITER //  
  2.   CREATE PROCEDURE `proc_CURSOR` (OUT param1 INT)  
  3.   BEGIN 
  4.   DECLARE a, b, c INT;  
  5.   DECLARE cur1 CURSOR FOR SELECT col1 FROM table1;  
  6.   DECLARE CONTINUE HANDLER FOR NOT FOUND SET b = 1;  
  7.   OPEN cur1;  
  8.   SET b = 0;  
  9.   SET c = 0;  
  10.   WHILE b = 0 DO  
  11.   FETCH cur1 INTO a;  
  12.   IF b = 0 THEN 
  13.   SET c = c + a;  
  14.   END IF;  
  15.   END WHILE;  
  16.   CLOSE cur1;  
  17.   SET param1 = c;  
  18.   END // 

其中,DECLARE cur1 CURSOR FOR SELECT col1 FROM table1;

表示將從table1表中選取col1列的內(nèi)容放到游標(biāo)curl中,即每次游標(biāo)遍歷的結(jié)果都放在curl中,要注意游標(biāo)只能向前遍歷,而不能向后,并且注意,游標(biāo)不能更新,最后關(guān)閉游標(biāo)。

【編輯推薦】

  1. MySQL中創(chuàng)建及優(yōu)化索引組織結(jié)構(gòu)的思路
  2. 微博 請問你是怎么優(yōu)化數(shù)據(jù)庫的?
  3. MySQL技巧:結(jié)合相關(guān)參數(shù) 做好Limit優(yōu)化
  4. MySQL數(shù)據(jù)庫的優(yōu)化(下)MySQL數(shù)據(jù)庫的高可用架構(gòu)方案
  5. MySQL數(shù)據(jù)庫的優(yōu)化(上)單機(jī)MySQL數(shù)據(jù)庫的優(yōu)化
責(zé)任編輯:艾婧 來源: it168網(wǎng)站
相關(guān)推薦

2010-05-12 17:55:30

MySQL 5.0

2019-06-20 15:25:14

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

2019-08-27 15:00:09

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

2018-07-05 11:30:56

數(shù)據(jù)庫瀏覽器IndexedDB

2010-06-13 11:21:32

MySQL 5.0

2018-11-05 15:14:42

MySQL編程語言技術(shù)

2022-02-22 07:37:26

VuePinia態(tài)管理庫

2012-03-06 09:50:24

Android SQLAndroidSQLite3

2009-06-15 13:59:00

netbeans6.1入門教程

2022-09-29 07:27:50

DaprKubernetes

2010-10-14 13:18:55

MySQL存儲過程

2010-07-23 14:41:30

Perl Hash

2018-07-24 09:38:35

JavaMySQLJDBC

2019-10-12 15:06:02

MySQL數(shù)據(jù)庫命令

2010-06-13 11:29:51

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

2011-07-19 15:18:46

存儲過程sql語句

2013-08-29 14:12:52

Storm分布式實(shí)時(shí)計(jì)算

2010-08-03 13:06:15

Flex Builde

2009-07-08 15:12:48

Java Servle

2014-05-26 15:35:55

Web組件Web Compone
點(diǎn)贊
收藏

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

主站蜘蛛池模板: 久久小视频 | 成人a免费 | 欧美一区免费 | 国产精品毛片久久久久久 | 久久国产精品免费一区二区三区 | 久久久国产一区二区三区四区小说 | 久久成人精品 | 黄在线| 色婷婷精品国产一区二区三区 | 日韩免费看视频 | 国产成人精品免高潮在线观看 | 午夜二区| 免费a网站| a级大片免费观看 | 国产免费又黄又爽又刺激蜜月al | 欧美激情啪啪 | 亚洲国产网 | 欧美日一区二区 | 一级片在线视频 | 久久鲁视频| 91视频免费视频 | 日韩在线精品 | 亚洲福利视频一区二区 | 日韩精品视频在线播放 | 国产精品96久久久久久 | 欧美性视频在线播放 | 久久久免费少妇高潮毛片 | 男人天堂免费在线 | 在线观看国产 | 成年女人免费v片 | 毛片1 | 国产精品欧美一区二区三区不卡 | www.激情.com| 成人午夜网站 | 国内精品成人 | 偷派自拍 | 国产ts人妖系列高潮 | 久久青 | 免费v片在线观看 | 久久精彩视频 | 射久久 |