1. 程式人生 > >MySQL中的儲存過程和函式使用詳解

MySQL中的儲存過程和函式使用詳解

一.對待儲存過程和函式的態度

在實際專案中應該儘量少用儲存過程和函式,理由如下:

1.移植性差,在MySQL中的儲存過程移植到sqlsever上就不一定可以用了。

2.除錯麻煩,在db中報一個錯誤和在應用層報一個錯誤不是一個概念,那將是毀滅性打擊,直接一個error:1045什麼的更本毫無頭緒。

3.擴充套件性不高

所以在網際網路時代大型專案應該儘量少使用(不使用)儲存過程和函式。

二.建立儲存過程

2.1什麼是儲存過程?

儲存過程和儲存函式都是一組sql語句的集合。這些語句集合被當做一個整體存入資料庫中。

2.2建立儲存過程的語法:

create procedure 儲存過程名(引數列表)

                    sql語句

例子:

delimiter //
create procedure pro()
reads sql data
begin
select * from stu;
end
//

那麼我們現在就有一個儲存過程pro了,但是這個儲存過程他是沒有引數的,他只是執行一次查詢操作。

我們現在來講解一下這個儲存過程的結構:

delimiter //  是將分號轉化為//   因為在sql執行時當他遇到分號 ; 時他就講停止所以我們必須將其轉化為 //直到最後一行才會停止執行。

reads sql  data   解釋characteristic的狀態在這裡是只讀模式,其他的模式還有:no sql 沒有sql語句 , ins  sql 不包含讀和寫的語句 , modifies sql data   包含寫入資料的語句等等。

begin /***/  end   在儲存過程中當有多條語句集合時我們必須使用begin和end

//   結束整個儲存過程

2.3使用儲存過程

在只是建立了一個儲存過程,那麼我們怎麼來使用這個儲存過程呢?

語法:call  儲存過程名()

將上一個儲存過程pro使用的例子:

call pro();

2.4建立一個帶引數的儲存過程

引數列表:儲存過程的引數有三種類型:in,out,inout 分別表示傳入引數和傳出引數,和即傳入也傳出引數。

例子:首先我們來建立兩張表:課程表是學生表的從表

create table stu(
stu_id bigint primary key auto_increment,#學號
stu_name 
varchar(10) not null,#姓名 stu_major int not null,#專業號 stu_sex char,#性別 stu_in date,#入學日期 stu_birth date,#出生日期 foreign key (stu_major) references major(ma_id)#專業外來鍵設定 ); create table major( ma_id int primary key, ma_name varchar(15), ma_boss varchar(10) );
insert into major values(1,"信管","張三");
insert into major values(2,"電子商務","李四");
insert into stu values(1,"小明",1,"男","2017-09-01","1998-12-23");
insert into stu values(2,"小高",1,"男","2017-09-01","1998-05-01");
insert into stu values(3,"小李",2,"男","2017-09-01","1999-04-01");

我們再來建立一個帶有引數的儲存過程找到學生的主修課的名字,程式碼如下:

delimiter //
create procedure pro1(in sname varchar(10),out ma varchar(10))
reads sql data
begin
select ma_name into ma from major where ma_id = (select stu_major from stu where stu_name=sname);
end
//

使用這個儲存過程:程式碼如下:

set @ma="沒查詢之前";
call pro1("小李",@ma);
select @ma;

結果如下:

解釋一下程式碼:首先使用set @ma 定義一個全域性變數,然後在使用call 儲存過程名 語法呼叫儲存過程,同時全域性變數ma的值也改變了。

三.建立一個儲存函式

3.1儲存過程和儲存函式的不同。

1.在函式中必須要有return返回值

2.在儲存過程中引數有in  out   inout三種,預設為in型別,但是在函式中只有一種in型別。

3.2建立一個函式

語法:create  function 函式名()

         return 返回型別

          sql語句集合

例子:

delimiter //
create function fun1(num int)
returns int
begin
return num+1000;
end
//

顯然函式與儲存過程的最大的區別就是在於return

3.3呼叫函式

使用語法不在使用關鍵字call,而是關鍵字select ,select  函式名

例子:

select fun1(100);

結果:

四.刪除儲存函式和儲存過程

 語法:drop   procedure  |   function  儲存過程名或者是函式名

例子:

drop procedure pro;

 注意他是不帶括號的

五.在儲存過程和儲存函式中使用遊標

5.1為什麼需要遊標?

當我們在使用儲存過程的時候可能用到多條資料,那麼我們就需要用到遊標來存放多條資料。

5.2使用遊標的注意點

遊標不能單獨存在,必須在儲存過程或者是儲存函式中使用。

5.3使用遊標

語法:

1.建立遊標:declare  遊標名  cursor  for  select語句  

2.開啟遊標:open  遊標名

3.使用遊標:fetch  遊標名  into  變數名

4.關閉游標:close 遊標名

5.4例子

delimiter //
create function fun3(id int)
returns int
reads sql data
begin
declare cur cursor for select stu_id from stu;
open cur;
fetch cur into id;
close cur;
return id;
end
//

 使用

set @id=0;
select fun3(@id);

 結果

可以發現遊標只是將第一個值給了變數。