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

MySQL中的存儲過程(詳細篇)

存儲 存儲架構
如果在實現用戶的某些需求時,需要編寫一組復雜的SQL語句才能實現的時候,那么我們就可以將這組復雜的SQL語句集提前編寫在數據庫中,由JDBC調用來執行這組SQL語句。把編寫在數據庫中的SQL語句集稱為存儲過程。

概述

由MySQL5.0 版本開始支持存儲過程。

如果在實現用戶的某些需求時,需要編寫一組復雜的SQL語句才能實現的時候,那么我們就可以將這組復雜的SQL語句集提前編寫在數據庫中,由JDBC調用來執行這組SQL語句。把編寫在數據庫中的SQL語句集稱為存儲過程。

存儲過程:(PROCEDURE)是事先經過編譯并存儲在數據庫中的一段SQL語句的集合。調用存儲過程可以簡化應用開發人員的很多工作,減少數據在數據庫和應用服務器之間的傳輸,對于提高數據處理的效率是很有好處的。

就是數據庫 SQL 語言層面的代碼封裝與重用。

存儲過程就類似于Java中的方法,需要先定義,使用時需要調用。存儲過程可以定義參數,參數分為IN、OUT、INOUT類型三種類型。

  1. IN類型的參數表示接受調用者傳入的數據;
  2. OUT類型的參數表示向調用者返回數據;
  3. INOUT類型的參數即可以接受調用者傳入的參數,也可以向調用者返回數據。

優點

  1. 存儲過程是通過處理封裝在容易使用的單元中,簡化了復雜的操作。
  2. 簡化對變動的管理。如果表名、列名、或業務邏輯有了變化。只需要更改存儲過程的代碼。使用它的人不用更改自己的代碼。
  3. 通常存儲過程都是有助于提高應用程序的性能。當創建的存儲過程被編譯之后,就存儲在數據庫中。
  4. 但是,MySQL實現的存儲過程略有所不同。
  5. MySQL存儲過程是按需編譯。在編譯存儲過程之后,MySQL將其放入緩存中。
  6. MySQL為每個連接維護自己的存儲過程高速緩存。如果應用程序在單個連接中多次使用存儲過程,則使用編譯版本,否則存儲過程的工作方式類似于查詢。
  7. 存儲過程有助于減少應用程序和數據庫服務器之間的流量。
  8. 因為
  9. 應運
  10. 程序不必發送多個冗長的SQL語句,只用發送存儲過程中的名稱和參數即可。
  11. 存儲過程度任何應用程序都是可重用的和透明的。存儲過程將數據庫接口暴露給所有的應用程序,以方便開發人員不必開發存儲過程中已支持的功能。
  12. 存儲的程序是安全的。數據庫管理員是可以向訪問數據庫中存儲過程的應用程序授予適當的權限,而不是向基礎數據庫表提供任何權限。

缺點

  1. 如果使用大量的存儲過程,那么使用這些存儲過程的每個連接的內存使用量將大大增加。
  2. 此外,如果在存儲過程中過度使用大量的邏輯操作,那么CPU的使用率也在增加,因為MySQL數據庫最初的設計就側重于高效的查詢,而不是邏輯運算。
  3. 存儲過程的構造使得開發具有了復雜的業務邏輯的存儲過程變得困難。
  4. 很難調試存儲過程。只有少數數據庫管理系統允許調試存儲過程。不幸的是,MySQL不提供調試存儲過程的功能。
  5. 開發和維護存儲過程都不容易。
  6. 開發和維護存儲過程通常需要一個不是所有應用程序開發人員擁有的專業技能。這可能導致應用程序開發和維護階段的問題。
  7. 對數據庫依賴程度較高,移值性差。

MySQL存儲過程的定義

存儲過程的基本語句格式

DELIMITER $$


CREATE
    /*[DEFINER = { user | CURRENT_USER }]*/
    PROCEDURE 數據庫名.存儲過程名([in變量名 類型,out 參數 2,...])
    /*LANGUAGE SQL
    | [NOT] DETERMINISTIC
    | { CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA }
    | SQL SECURITY { DEFINER | INVOKER }
    | COMMENT 'string'*/
  BEGIN
    [DECLARE 變量名 類型 [DEFAULT 值];]
    存儲過程的語句塊;
  END$$


DELIMITER ;

存儲過程中的參數分別是 in,out,inout三種類型;

  1. in代表輸入參數(默認情況下為in參數),表示該參數的值必須由調用程序指定。
  2. ou代表輸出參數,表示該參數的值經存儲過程計算后,將out參數的計算結果返回給調用程序。
  3. inout代表即時輸入參數,又是輸出參數,表示該參數的值即可有調用程序制定,又可以將inout參數的計算結果返回給調用程序

存儲過程中的語句必須包含在BEGIN和END之間。

DECLARE中用來聲明變量,變量默認賦值使用的DEFAULT,語句塊中改變變量值,使用SET 變量=值;

存儲過程的使用

定義一個存儲過程

DELIMITER $$


CREATE
    PROCEDURE `demo`.`demo1`()
  -- 存儲過程體
  BEGIN
    -- DECLARE聲明 用來聲明變量的
    DECLARE de_name VARCHAR(10) DEFAULT '';
    
    SET de_name = "jim";
    
    -- 測試輸出語句(不同的數據庫,測試語句都不太一樣。
    SELECT de_name;
  END$$


DELIMITER ;

調用存儲過程

CALL demo1();

定義一個有參數的存儲過程

先定義一個student數據庫表:

現在要查詢這個student表中的sex為男的有多少個人。

DELIMITER $$


CREATE
    PROCEDURE `demo`.`demo2`(IN s_sex CHAR(1),OUT s_count INT)
  -- 存儲過程體
  BEGIN
    -- 把SQL中查詢的結果通過INTO賦給變量
    SELECT COUNT(*) INTO s_count FROM student WHERE sex= s_sex;
    SELECT s_count;
    
  END$$
DELIMITER ;

調用這個存儲過程

-- @s_count表示測試出輸出的參數
CALL demo2 ('男',@s_count);

定義一個流程控制語句 IF ELSE

IF 語句包含多個條件判斷,根據結果為 TRUE、FALSE執行語句,與編程語言中的 if、else if、else 語法類似。

DELIMITER $$
CREATE
    PROCEDURE `demo`.`demo3`(IN `day` INT)
  -- 存儲過程體
  BEGIN
    IF `day` = 0 THEN
    SELECT '星期天';
    ELSEIF `day` = 1 THEN
    SELECT '星期一';
    ELSEIF `day` = 2 THEN
    SELECT '星期二';
    ELSE
    SELECT '無效日期';
    END IF;
    
  END$$
DELIMITER ;

調用這個存儲過程

CALL demo3(2);

定義一個條件控制語句 CASE

case是另一個條件判斷的語句,類似于編程語言中的 choose、when語法。MySQL 中的 case語句有兩種語法格式。

  1. 第一種
DELIMITER $$
CREATE 
    PROCEDURE demo4(IN num INT)
  BEGIN
    CASE -- 條件開始
  
    WHEN num<0 THEN 
      SELECT '負數';
    WHEN num>0 THEN 
      SELECT '正數';
    ELSE 
    SELECT '不是正數也不是負數';
  
    END CASE; -- 條件結束
  END$$
DELIMITER;

調用這個存儲過程

CALL demo4(1);

2.第二種

DELIMITER $$
CREATE 
    PROCEDURE demo5(IN num INT)
  BEGIN
    CASE num  -- 條件開始
    WHEN 1 THEN 
      SELECT '輸入為1';
    WHEN 0 THEN 
      SELECT '輸入為0';
    ELSE 
    SELECT '不是1也不是0';
    END CASE; -- 條件結束
  END$$
DELIMITER;

調用此函數

CALL demo5(0);

定義一個循環語句 WHILE

DELIMITER $$
CREATE 
    PROCEDURE demo6(IN num INT,OUT SUM INT)
  BEGIN
       SET SUM = 0;
       WHILE num<10 DO -- 循環開始
           SET num = num+1;
           SET SUM = SUM+num;
           END WHILE; -- 循環結束
  END$$
DELIMITER;

調用此函數

-- 調用函數
CALL demo6(0,@sum);


-- 查詢函數
SELECT @sum;

定義一個循環語句 REPEAT UNTLL

REPEATE…UNTLL 語句的用法和 Java中的 do…while 語句類似,都是先執行循環操作,再判斷條件,區別是REPEATE 表達式值為 false時才執行循環操作,直到表達式值為 true停止。

-- 創建過程
DELIMITER $$
CREATE 
    PROCEDURE demo7(IN num INT,OUT SUM INT)
  BEGIN
       SET SUM = 0;
       REPEAT-- 循環開始
    SET num = num+1;
    SET SUM = SUM+num ;
    UNTIL num>=10
    END REPEAT; -- 循環結束
  END$$
DELIMITER;

調用此函數

CALL demo7(9,@sum);


SELECT @sum;

定義一個循環語句 LOOP

循環語句,用來重復執行某些語句。

執行過程中可使用 LEAVE語句或者ITEREATE來跳出循環,也可以嵌套IF等判斷語句。

  1. LEAVE 語句效果對于Java中的break,用來終止循環;
  2. ITERATE語句效果相當于Java中的continue,用來跳過此次循環。進入下一次循環。且ITERATE之下的語句將不在進行。
DELIMITER $$
CREATE 
    PROCEDURE demo8(IN num INT,OUT SUM INT)
  BEGIN
       SET SUM = 0;
       demo_sum:LOOP-- 循環開始
    SET num = num+1;
    IF num > 10 THEN
        LEAVE demo_sum; -- 結束此次循環
    ELSEIF num <= 9 THEN
        ITERATE demo_sum; -- 跳過此次循環
    END IF;
    
    SET SUM = SUM+num;
    END LOOP demo_sum; -- 循環結束
  END$$
DELIMITER;

調用此函數

CALL demo8(0,@sum);


SELECT @sum;


使用存儲過程插入信息

DELIMITER $$
CREATE 
    PROCEDURE demo9(IN s_student VARCHAR(10),IN s_sex CHAR(1),OUT s_result VARCHAR(20))
  BEGIN
     -- 聲明一個變量 用來決定這個名字是否已經存在
     DECLARE s_count INT DEFAULT 0;
     -- 驗證這么名字是否已經存在
     SELECT COUNT(*) INTO s_count FROM student WHERE `name` = s_student;  
     IF s_count = 0 THEN
          INSERT INTO student (`name`, sex) VALUES(s_student, s_sex);
    SET s_result = '數據添加成功';
     ELSE
                SET s_result = '名字已存在,不能添加';
                SELECT s_result;
     END IF;
  END$$
DELIMITER;

調用此函數

CALL demo9("Jim","女",@s_result);

再次調用次函數

CALL demo9("Jim","女",@s_result)

存儲過程的管理

顯示存儲過程

SHOW PROCEDURE STATUS

顯示特定數據庫的存儲過程

SHOW PROCEDURE STATUS WHERE db = 'db名字' AND NAME = 'name名字';


顯示特定模式的存儲過程

SHOW PROCEDURE STATUS WHERE NAME LIKE '%mo%';

顯示存儲過程的源碼

SHOW CREATE PROCEDURE 存儲過程名;

刪除存儲過程

DROP PROCEDURE 存儲過程名;

后端調用存儲過程的實現

在mybatis當中,調用存儲過程

<parameterMap type="savemap" id=“usermap"> 
  <parameter property="name" jdbcType="VARCHAR" mode="IN"/>
  <parameter property="sex" jdbcType="CHAR" mode="IN"/>
  <parameter property="result" jdbcType="VARCHAR" mode="OUT"/>
</parameterMap>


<insert id="saveUserDemo" parameterMap="savemap" statementType="CALLABLE"> 
{call saveuser(?, ?, ?)} 
</insert >

調用數據庫管理

HashMap<String, Object> map = new HashMap<String, Object>(); 
  map.put("name", "Jim"); 
  map.put("sex","男");
  userDao.saveUserDemo(map); 
  map.get(“result”);//獲得輸出參數

通過這樣就可以調用數據庫中的存儲過程的結果。

責任編輯:武曉燕 來源: 今日頭條
相關推薦

2009-07-17 13:54:51

JDBC存儲過程

2009-07-23 14:10:38

Hibernate J

2009-12-21 09:39:50

Oracle 存儲過程

2011-07-22 13:47:23

存儲過程

2010-04-26 18:17:19

Oracle存儲過程

2010-05-27 17:45:13

MySQL存儲過程

2010-05-31 16:57:09

2016-09-07 20:28:17

MySQL存儲數據庫

2020-11-26 10:33:44

MySQL存儲函數

2010-06-01 15:09:55

MySQL 存儲過程

2019-01-02 13:03:53

MySQL存儲權限

2021-10-15 06:43:11

數據庫存儲過程

2010-05-19 14:03:41

MySQL 存儲過程

2010-10-08 16:55:44

MySql存儲過程

2018-04-18 09:18:44

數據庫MySQL存儲過程

2010-10-09 16:26:59

mysql存儲過程

2010-05-27 17:56:39

MySQL存儲過程

2010-11-26 16:18:13

MySQL變量定義

2009-01-19 08:59:04

PHP調用MySQL存儲過程MySQLi擴展

2010-10-09 17:08:15

MySQL存儲過程
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: www.亚洲精品 | 伊人伊人| 国产色婷婷精品综合在线手机播放 | 久久亚洲国产精品日日av夜夜 | 天久久| 免费久久久 | 成人1区2区 | 亚洲欧美日韩精品久久亚洲区 | 久久性av | 成人在线h | 国产亚洲黄色片 | 毛片网站在线观看 | 99re视频在线免费观看 | 亚洲精品99999 | 日韩精品一区二区三区中文字幕 | 亚洲 欧美 在线 一区 | 夜夜爽99久久国产综合精品女不卡 | 97国产精品视频人人做人人爱 | 99久久婷婷国产综合精品电影 | 91亚洲国产精品 | 精品欧美一区二区三区 | 成人不卡视频 | 久久中文一区二区 | 日韩毛片在线免费观看 | 日韩成人在线播放 | 青青草社区| 国产精品久久久久久久久久99 | 97精品超碰一区二区三区 | av官网在线| 亚洲精品一区二区三区丝袜 | 日韩国产在线 | 日韩中字幕 | 日韩一区二区在线视频 | 日韩三级在线观看 | 欧美精品一区二区三区一线天视频 | 欧美久久天堂 | 日韩久草 | 午夜爱爱网 | 精品国产精品三级精品av网址 | 精品日韩一区 | 国产精品久久久久久久 |