萬盛學電腦網

 萬盛學電腦網 >> 數據庫 >> mysql教程 >> mysql存儲過程與函數

mysql存儲過程與函數

   存儲過程

  存儲過程是一段代碼,由存儲在一個數據庫的目錄中、聲明式的和過程式的sql語句組成,可以從一個程序、觸發器或者另一個存儲過程調用它從而激活它。

  每個存儲過程包含至少3部分:一個參數列表、一個存儲過程、一個名字。

  一個數據庫中的存儲過程的名字必須是唯一的,就像表的名字一樣。

  一個參數列表可以有0個、1個或多個參數,通過這些參數,過程就可以和外界聯系。

  存儲過程支持3中參數類型:

  1、輸入參數IN:數據可以傳遞到存儲過程;

  2、輸出參數OUT:數據可以由存儲過程傳到外界;

  3、輸入輸出參數INOUT:既可以充當輸入參數,也可以充當輸出參數。

  就像c語言函數一樣,即使沒有參數,過程名後面還是需要跟一對括號。

  存儲過程以begin開始end結束,且之間還可以嵌套begin-end塊。

  局部變量:

  declare 變量列表 變量類型 [default 默認值]

  存儲過程不僅可以使用局部變量,還可以使用全局變量。

  默認值不僅限於直接量,還可以是符合表達式,也可以是標量子查詢。

?

1 2 3 4 5 6 7 8 mysql> delimiter // mysql> create procedure test (in a integer)     -> begin     -> declare b integer default     -> (select count(*) from student );     -> end     -> // Query OK, 0 rows affected (0.42 sec)

  set語句

  set用於給一個變量賦值。如:

?

1 2 3 set a = 1; set a := 1; set a = 1,b := a;

  leave語句

  離開一個塊(循環塊或者語句塊),類似於break;

  如下,進入begin後立即離開。

?

1 2 3 4 mysql> create procedure test (in a integer)     -> block : begin     -> leave block;     -> end//

  iterate語句

  進入一個循環。

  call語句

  調用存儲過程。

  if-esle語句

  格式:

  if 條件 then 語句 ;

  elseif 條件 then 語句;

  esle 語句;

  end if

?

1 2 3 4 5 6 7 8 9 mysql> create procedure test (in a integer)     -> begin     -> declare b integer;     -> if a < 60 then set b = -1;     -> elseif a >60 then set b = 1;     -> else set b = 0;     -> end if;     -> end     -> //

  case語句

  格式:

  case

  when 條件 then 語句;

  when 條件 then 語句;

  else 語句;

  end case;

  while 語句

  格式:

  while 條件 do

  語句;

  end while;

?

1 2 3 4 5 6 7 mysql> create procedure test (in a integer)     -> begin     -> declare b integer default 1;     -> while b < a do     -> set b = b + 1;     -> end while;     -> end//

  repeat語句

  格式:

  repeat

  語句;

  until 條件 end repeat;

?

1 2 3 4 5 6 7 mysql> create procedure test (in a integer)     -> begin     -> declare b integer default 1;     -> repeat     -> set b = b + 1;     -> until b > a end repeat;     -> end//

  loop語句

  格式:

  loop

  if或case條件 leave loop;

  語句;

  end loop;

?

1 2 3 4 5 6 7 8 9 mysql> create procedure test (in a integer)     -> begin     -> declare b integer default 1;     -> loop_block: loop     -> if b > a then leave loop_block;     -> end if;     -> set b = b + 1;     -> end loop;     -> end//

  select into 語句

  用於將select的查詢結果賦值給過程內的變量。

?

1 2 3 4 mysql> create procedure test (out b integer)     -> begin     -> select count(*) into b from student;     -> end//

  現在student內有4條數據,調用test如下:

?

1 2 3 4 5 6 7 8 mysql> set @b = 0// mysql> call test(@b)// mysql> select @b// +------+ | @b   | +------+ |    4 | +------+

  如果select語句查詢的結果包含有多行,直接使用into賦值時不可行的。比如:

?

1 2 3 4 mysql> create procedure test (out b integer)     -> begin     -> select stu_id into b from student;     -> end//

  雖然語法正確,但是在調用時報錯:

?

1 2 mysql> call test(@b)// ERROR 1172 (42000): Result consisted of more than one r
copyright © 萬盛學電腦網 all rights reserved