1. 程式人生 > 資訊 >胡厚崑:不管多艱難,華為對創新的投入不會減少

胡厚崑:不管多艱難,華為對創新的投入不會減少

我的小站:我的部落格

1.1 儲存過程簡介

儲存過程是一組為了完成特定功能的SQL語句集合,經編譯後儲存在資料庫中。使用者通過指定儲存過程的名字並給出引數的值

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

儲存過程(Stored Procedure)是一種在資料庫中儲存複雜程式,以便外部程式呼叫的一種資料庫物件。

儲存過程是為了完成特定功能的SQL語句集,經編譯建立並儲存在資料庫中,使用者可通過指定儲存過程的名字並給定引數(需要時)來呼叫執行。

儲存過程思想上很簡單,就是資料庫 SQL 語言層面的程式碼封裝與重用。

1.2 儲存過程的優缺點

優點:

1) 封裝性

儲存過程被建立後,可以在程式中被多次呼叫,而不必重新編寫該儲存過程的 SQL 語句,並且資料庫專業人員可以隨時對儲存過程進行修改,而不會影響到呼叫它的應用程式原始碼。

2) 可增強 SQL 語句的功能和靈活性

儲存過程可以用流程控制語句編寫,有很強的靈活性,可以完成複雜的判斷和較複雜的運算。

3) 可減少網路流量

由於儲存過程是在伺服器端執行的,且執行速度快,因此當客戶計算機上呼叫該儲存過程時,網路中傳送的只是該呼叫語句,從而可降低網路負載。

4) 高效能

儲存過程執行一次後,產生的二進位制程式碼就駐留在緩衝區,在以後的呼叫中,只需要從緩衝區中執行二進位制程式碼即可,從而提高了系統的效率和效能。

5) 提高資料庫的安全性和資料的完整性

使用儲存過程可以完成所有資料庫操作,並且可以通過程式設計的方式控制資料庫資訊訪問的許可權。

此資料來自知乎大佬 —— Mysql儲存過程的詳細講解 - 知乎 (zhihu.com)

缺點:

  • 儲存過程,往往定製化於特定的資料庫上,因為支援的程式語言不同。當切換到其他廠商的資料庫系統時,需要重寫原有的儲存過程。
  • 儲存過程的效能調校與撰寫,受限於各種資料庫系統。

1.3 使用儲存過程

1. 建立儲存過程

使用 CREATE PROCEDURE 語句建立儲存過程。語法格式如下

 CREATE PROCEDURE 過程名(過程引數)
 [特性]
 儲存過程體

說明

常用特性有:

  1. LANGUAGE SQL:儲存過程語言,預設值為 SQL
  2. CONTAINS SQL:表示子程式不包含讀或寫資料的語句
  3. NOT SQL:表示子程式不包含 SQL 語句
  4. READDS SQL DATA:表示子程式包含讀資料的語句,但不包含寫的語句
  5. MODIFIES SQL DATA:表示子程式包含寫資料的語句

如果 2~5 這些特徵沒有明確指定,預設值為:CONTAINS SQL

  1. SQL SECURITY { DEFINER | INVOKER }:用來指定儲存過程的執行許可權,預設值為 DEFINER

    1. DEFINER:使用建立者的許可權執行
    2. INVOKER:使用執行者的許可權執行

下面結合具體例項講解儲存過程的建立過程:

 DELIMITER //
 CREATE PROCEDURE student(過程引數)
 BEGIN
    SELECT * FROM student;
 END
 DELIMITER ;

說明

1)宣告語句分隔符

 DELIMITER $$ 或者 DELIMITER //

需注意的是,如果沒有宣告語句分隔符的話,編譯器就會把儲存過程當成 SQL 語句處理,這樣編譯過程就會報錯。

2)定義儲存過程的引數

在 MySQL 中,儲存過程的引數包括 3 種類型

  • IN:輸入引數:表示呼叫者向過程傳入值(傳入值可以是字面量或變數)
  • OUT: 輸出引數:表示過程向呼叫者傳出值(可以返回多個值)(傳出值只能是變數);
  • INOUT:輸入輸出引數:既表示呼叫者向過程傳入值,又表示過程向呼叫者傳出值(值只能是變數)。

3)過程提的標識

在定義儲存過程的過程體時,需要標識開始和結束。語法格式如下:

 BEGIN …… END 分隔符

2. 呼叫儲存過程

 CALL 儲存過程名(引數列表);

3.儲存過程中的變數

 DECLARE 變數名 資料型別 [DEFAULT 值]

1.4 檢視儲存過程

1.檢視儲存過程的狀態

類似檢視資料庫中的資料表資訊

 SHOW PROCEDURE STATUS;

2.檢視儲存過程的建立程式碼

 SHOW CREATE PROCEDURE 儲存過程名;

1.5 修改儲存過程

在MySQL中,使用 ALTER PROCEDURE語句可以修改已建立的儲存過程,但是僅僅能夠修改儲存過程時定義的特性。語法格式如下:

ALTER PROCEDURE 儲存過程名 [特性 ……]

1.6 刪除儲存過程

類似刪除資料庫中的資料表,MySQL使用者可以使用 DROP PROCEDURE語句刪除已建立的儲存過程。語法格式如下:

DROP PROCEDURE 儲存過程名;

2. 儲存過程的控制語句

2.1 條件語句

1.IF-ELSEIF-ELSE條件語句

IF 條件 THEN 語句列表
	[ELSEIF 條件 THEN 語句列表]
	[ELSE 語句列表]
END IF;

2.CASE條件語句

在 MySQL 中的 CASE 條件語句有兩種寫法。

第一種語法格式如下:

CASE
	WHEN 條件 THEN 語句列表
	[WHEN 條件 THEN 語句列表]
	[ELSE 語句列表]
END CASE;

在 CASE 語句中,若條件為真,則相應的 SQL 語句列表來執行。

若沒有條件匹配,則在 ELSE 子句裡的語句列表被執行。

另外,CASE 語句只返回第一個符合條件的值,剩下的部分將會被自動忽略。

例項:

定義儲存過程,輸入一個整數,使用 case 語句判斷是正數還是負數,程式碼如下所示:

-- 建立過程
create procedure pro_demo(in num int)
begin
case -- 條件開始
when num < 0 then select '負數';
when num = 0 then select '不是正數也不是負數';
else select '正數';
end case; -- 條件結束
end;
-- 呼叫過程
call pro_demo(1);

執行結果:

正數
正數

第二種語法格式如下:

CASE 列名
	WHEN 條件 THEN 語句列表
	[WHEN 條件 THEN 語句列表]
	[ELSE 語句列表]
END CASE;

例項:

定義儲存過程,輸入一個整數,使用 case 語句判斷是 1 還是 2,程式碼如下所示:

-- 建立過程
create procedure pro_demo(in num int)
begin
case num -- 條件開始
when 1 then select '數值是 1';
when 2 then select '數值是 2';
else select '不是 1 也不是 2';
end case; -- 條件結束
end;
-- 呼叫過程
call pro_demo(3);

執行結果:

不是 1 也不是 2
不是 1 也不是 2

此處例項來自 (398條訊息) MySQL---儲存過程詳解ʜғ的部落格-CSDN部落格mysql儲存過程詳解

2.2 迴圈語句

1)WHILE 迴圈語句

WHILE 迴圈語句時最普遍使用的迴圈語句,它首先判斷條件是否成立,若成立,則執行迴圈體。語法如下:

while 條件 DO
	迴圈體
end while;

例項:

delimiter //
-- 建立過程 使用 while 迴圈輸出 1 到 10 的累加和
create procedure pro_demoWhile(in i int)
begin
    declare num int default 0;
    declare sum int default 0;
    while num < 10 do -- 迴圈開始
        set num = num + i;
        set sum = sum + num;
        end while; -- 迴圈結束
    select sum;
end;
-- 呼叫過程
call pro_demoWhile(1);

執行結果:55

2)LOOP 迴圈語句

LOOP迴圈結構不需要判斷初始條件,直接執行迴圈體,知道遇到 LEAVE 語句才退出迴圈。語法格式如下:

loop_name: LOOP
        IF 條件 THEN -- 滿足條件時離開迴圈
                LEAVE loop_name;  -- 和 break 差不多都是結束迴圈
        END IF;
END LOOP;

例項:

delimiter //
-- 建立過程 使用 loop 迴圈輸出 1 到 10 的累加和
create procedure pro_demoLoop(i int)
begin
    declare num int default 0;
    declare sum int default 0;
    #loop 迴圈語法:
    loop_name:loop
        set num = num + i;
        set sum = sum + num;
        if num >= 10 THEN -- 滿足條件時離開迴圈
            leave loop_name;  -- 和 break 差不多都是結束迴圈
        end if;
    end loop;
    select sum;
end;
-- 呼叫過程
call pro_demoLoop(1);

執行結果:55

3)REPEAT 迴圈語句

REPEAT 迴圈與 LOOP 迴圈類似,不需要初始條件就可以直接進入迴圈體。

但是LOOP 迴圈不同的是,它有退出條件。因此,REPEAT 是執行一次操作後檢查條件是否成立。若成立,則結束迴圈;若不成立,則繼續執行下一次迴圈操作。

這種先執行迴圈操作再判斷迴圈條件的迴圈與 Java 中的 do-while 迴圈類似。語法格式如下:

repeat
    迴圈體
until 條件 end repeat;

例項:

delimiter //
-- 建立過程 使用 while 迴圈輸出 1 到 10 的累加和
create procedure pro_demoRepeat(i int)
begin
    declare num int default 0;
    declare sum int default 0;
    # repeat 迴圈語法
    repeat
        set num = num + i;
        set sum = sum + num;
    until num >= 10 end repeat;
    select sum;
end;
-- 呼叫過程
call pro_demoRepeat(1);

執行結果:55

3. 總結

  1. 儲存過程是一組為了完成特定功能的 SQL 語句集合,MySQL 從5.0版本之後開始支援儲存過程。
  2. 儲存過程具有安全性高、減少網路流量等優勢,在實際專案開發過程中具有廣泛的應用。
  3. 建立儲存過程使用 CREATE PROCEDURE 結構,呼叫儲存過程使用 CALL 關鍵字。
  4. MySQL 儲存過程支援多種控制語句,包括條件語句( IF和 CASE )、迴圈語句(WHILE、LOOP、REPEAT)。