MariaDB過程


MariaDB程式是一個儲存的程式,用來傳遞引數。它不像函式那樣需要返回一個值(當然也不用返回)。

可以建立和刪除像函式一樣的過程。

1. 建立過程

可以像建立MariaDB中的函式一樣建立過程。

語法:

CREATE   
[ DEFINER = { CURRENT_USER | user_name } ]   
PROCEDURE procedure_name [ (parameter datatype [, parameter datatype]) ]  
[ LANGUAGE SQL  
| DETERMINISTIC  
| NOT DETERMINISTIC  
| { CONTAINS SQL   
  | NO SQL  
  | READS SQL DATA  
  | MODIFIES SQL DATA }  
| SQL SECURITY { DEFINER | INVOKER }  
| COMMENT 'comment_value'  
BEGIN  
   declaration_section  
   executable_section  
END;

引數說明

  • DEFINER:可選。
  • procedure_name:在MariaDB中分配給此過程的名稱。
  • Parameter:傳入過程的一個或多個引數。建立過程時,可以宣告三種型別的引數:
    • IN:引數可以被程式參照。 該引數的值不能被程式覆蓋。
    • OUT:引數不能被程式參照,但引數的值可以被程式覆蓋。
    • IN OUT:引數可以被程式參照,引數的值可以被程式覆蓋。
  • LANGUAGE SQL:語法為可移植語法,但不會影響函式。
  • DETERMINISTIC:表示該函式將始終返回給定一組輸入引數的一個結果。
  • NOT DETERMINISTIC:表示給定一組輸入引數,該函式可能會返回不同的結果。 結果可能受到表格資料,亂數字或伺服器變數的影響。
  • CONTAINS SQL:這是預設的。這是一個告知MariaDB該函式包含SQL的資訊性子句,但資料庫不驗證它是真的。
  • NO SQL:這是一個資訊性子句,不使用也不會影響功能。
  • READS SQL DATA:這是一個告知MariaDB的函式,它將使用SELECT語句讀取資料,但不會修改任何資料。
  • MODIFIES SQL DATA:這是一個告知MariaDB的資訊子句,該函式將使用INSERTUPDATEDELETE或其他DDL語句修改SQL資料。
  • declaration_section:宣告區域性變數的過程中的位置。
  • executable_section:輸入過程程式碼的過程中的位置。

範例

在MariaDB資料庫中建立一個名為「CalcValue」的過程。參考以下實現程式碼 -

DELIMITER //  
CREATE procedure CalcValue ( OUT ending_value INT )  
DETERMINISTIC  
BEGIN  
   DECLARE total_value INT;  
   SET total_value = 50;  
   label1: WHILE total_value <= 3000 DO  
     SET total_value = total_value * 2;  
   END WHILE label1;  
   SET ending_value = total_value;  
END; //  
DELIMITER ;

開啟HeidiSQL,執行上面建立語句 -

現在重新整理左側的testdb資料庫,可以看到名為「CalcValue」的過程已建立。

編輯或檢視這個過程,如下圖所示 -

2. 呼叫過程

現在可以看到名為「CalcValue」的過程已建立。可以參考如下方式來呼叫過程:

MariaDB [testdb]> CALL CalcValue(@salary);
Query OK, 0 rows affected (0.00 sec)

MariaDB [testdb]> select @salary;
+---------+
| @salary |
+---------+
|    3200 |
+---------+
1 row in set (0.00 sec)

3. 刪除過程

可以使用以下命令刪除過程:

語法:

DROP procedure [ IF EXISTS ] procedure_name;

引數說明:

  • procedure_name:它指定要刪除的過程的名稱。

範例:

DROP procedure CalcValue;

可以看到現在過程已經被刪除,並且在列表中不可見。