首頁 > 軟體

MySQL資料庫之儲存過程 procedure

2022-06-15 18:01:20

前言:

stored procedure 完成特定功能的SQL語句集,儲存在資料庫中,經過第一次編譯之後再次呼叫不需要編譯(效率較高)

1、儲存過程與函數的區別

1.1、相同點

  • 都是為了可重複地執行運算元據庫的SQL語句集合
  • 都是一次編譯,多次執行

1.2、不同點

  • 識別符號不同,函數function 過程 procedure
  • 函數中有返回值,且必須返回,而過程沒有返回值
  • 過程無返回值型別,不能將結果直接賦值給變數;函數有返回值型別,呼叫時,除了在select中,必須將返回值賦值給變數
  • 函數可以再select語句中直接使用,而過程不能

2、儲存過程的操作

2.1、建立過程

基本語法:

create procedure 過程名字([參數列])
bengin
    過程體
end
結束符

如果只有只有一條指令可以省略begin和end

create procedure my_pro1()
select * from my_student;

過程基本上可以完成函數對應的所有功能:

-- 修改語句結束符
delimiter $$
-- 建立過程
create procedure my_pro2()
begin
    -- 求1到100之間的和
    -- 建立區域性變數
    declare i int default 1;
    -- declare sum int default 0;
    -- 對談變數
    set @sum = 0;
    -- 開始迴圈獲取結果
    while i <= 100 do
        -- 求和
        set @sum = @sum + i;
        set i = i + 1;
    end while;

    -- 顯示結果
    select @sum;
end
$$
delimiter ;

2.2、檢視過程

-- 檢視所有儲存過程
show procedure status [like 'pattern'];
-- 檢視過程的建立語句
show create procedure 過程名字G

2.3、呼叫過程

過程沒有返回值

基本語法:

call 過程名([實參列表]);
-- eg:
call my_pro2();
+------+
| @sum |
+------+
| 5050 |
+------+

2.4、刪除過程

基本語法:

drop procedure 過程名;

3、儲存過程的形參型別

儲存過程的引數和函數一樣,需要制定其型別

但是儲存過程對引數還有額外的要求,自己的引數分類:

  • in:(值傳遞)引數從外部傳入,在過程內部使用,可以是直接資料,也可以是儲存資料的變數
  • out:(參照傳遞)引數在過程中賦值,傳入必須是變數,如果有外部資料,會被清空為null
  • inout:(參照傳遞)資料可以從外部傳入過程內部使用,同時內部操作之後,又回將資料返回給外部

程式碼範例:

-- 建立3個對談變數
set @var1 = 1;
set @var2 = 2;
set @var3 = 3;
-- 查詢對談變數
select @var1, @var2, @var3;
+-------+-------+-------+
| @var1 | @var2 | @var3 |
+-------+-------+-------+
|     1 |     2 |     3 |
+-------+-------+-------+
1 row in set (0.00 sec)
-- 修改語句結束符
delimiter $$
-- 定義過程
create procedure my_pro3(in a int, out b int, inout c int)
begin
    -- 檢視傳入的3個資料值
    select a, b, c;
    -- +------+------+------+
    -- | a    | b    | c    |
    -- +------+------+------+
    -- |    1 | NULL |    3 |
    -- +------+------+------+
    -- 修改3個變數值
    set a = 10;
    set b = 20;
    set c = 30;
    select a, b, c;
    -- +------+------+------+
    -- | a    | b    | c    |
    -- +------+------+------+
    -- |   10 |   20 |   30 |
    -- +------+------+------+
    -- 檢視對談變數
    select @var1, @var2, @var3;
    -- +-------+-------+-------+
    -- | @var1 | @var2 | @var3 |
    -- +-------+-------+-------+
    -- |     1 |     2 |     3 |
    -- +-------+-------+-------+
    -- 修改對談變數
    set @var1 = 'a';
    set @var2 = 'b';
    set @var3 = 'c';
    select @var1, @var2, @var3;
    -- +-------+-------+-------+
    -- | @var1 | @var2 | @var3 |
    -- +-------+-------+-------+
    -- | a     | b     | c     |
    -- +-------+-------+-------+
end
$$
delimiter ;
-- 呼叫過程
call my_pro3(@var1, @var2, @var3);

-- 再次檢視對談變數
mysql> select @var1, @var2, @var3;
+-------+-------+-------+
| @var1 | @var2 | @var3 |
+-------+-------+-------+
| a     |    20 |    30 |
+-------+-------+-------+

分析:

  • 1、實參傳入過程之後,實際上沒有改變外部變數的值,而是把值給了形參,out型別不能接收外部變數的值,預設為null
  • 2、當過程執行到end 的時候,如果是out或inout變數,會將形參的值重新賦值給實參變數

IT145.com E-mail:sddin#qq.com