MySQL必備知識存儲過程和函數

存儲過程和函數的概念

存儲過程和視圖類似,都是一個事先寫好命令並編譯後存在數據庫中的MySQL語句集合。是用於簡化開發人員的工作,減少數據在數據庫和應用服務器之間傳輸,提高處理效率的。

存儲過程和函數的區別

既然是函數,就會有值的傳入和傳出,其中存在的區別爲:
存儲過程:參數的傳遞(參數類型)能用 IN 、 OUT 、 INOUT ,並且沒有直接的返回值。

IN 表示數據傳入
OUT 表示數據傳出
INOUT 表示既可以傳入又可以傳出

函數:參數只能使用IN,並且必須要有返回值。
存儲過程內不能使用 use 切換數據庫

存儲過程

存儲過程 語句(procedure)

無參存儲過程

創建無參存儲

delimiter 
// ##開始創建存儲過程 
create procedure 存儲過程名() 
begin 
#SQL語句1; 
#SQL語句2; 
#SQL語句3; 
#SQL語句4; 
end//

delimiter

MySQL執行的過程中,會以 ; 作爲結束命令
delimiter 是一個編譯器指令,告訴MySQL解釋器,MySQL是否可以執行了,該段命令是否已經結束了
delimiter 指令的使用

#將結束符變成別的用法 
delimiter  
#存儲過程 
#結束符變成 ; 
delimiter ;

調用存儲過程

call 存儲過程名();

call 存儲過程(變量);

查看存儲過程

 show create procedure 存儲過程名;

刪除存儲過程

drop procedure 存儲過程名;

修改存儲過程

alter procedure 存儲過程名;

帶參存儲過程

創建帶參存儲過程

create procedure 存儲過程名( 
in[out][inout] 參數名1 參數類型1, 
in[out][inout] 參數名2 參數類型2,……, 
in[out][inout] 參數名n 參數類型n) 
begin 
#SQL語句; end;

調用帶參存儲過程

call 存儲過程名(參數值1,參數值2,……,參數值n);

運用帶參存儲過程查詢數據

例如:

create procedure insert_stu( 
in sname varchar(255) ,in sex enum('男','女'),in age int ) 
   begin
   ##查詢插入的數據 
   select sname,sex,age; 
   ##插入數據 
   insert into student_tb(s_name,s_sex,s_age) 
   value(sname,sex,age); 
   end$$ 
   ## 調用存儲過程 
   call insert_stu('小明','男',21); 
   call insert_stu('小李','女',20);

運用帶參存儲過程插入數據

例如:

create procedure put(in stu_no int,in stu_name varchar(30),
  in stu_birthday date,
  in stu_cno int) 
  begin 
  insert into student 
  values(stu_no,stu_name,stu_birthday,stu_cno); 
  end; 
  call putstr(11,'小海','2000-1-1',2);

會話變量

查看會話變量 當前連接有效 重新連接恢復默認值
其他的客戶端看不到自己定義的會話變量

## 查看會話變量 
show session variables;

全局變量

當前服務器啓動時有效
重啓服務恢復默認值

## 查看全局變量 
show global variables;

注意:有些變量都是系統自定義的,用於存儲數據庫中的默認數據

自定義函數

create function 函數名(函數參數 類型) 
returns 返回值類型 
begin
##邏輯代碼 
return(函數返回值) 
end;

8.0版本數據庫,增加了一個安全選項
需要執行一段下面的代碼才能創建函數

set global log_bin_trust_function_creators=TRUE;

調用函數

直接使用函數

 select 函數名(函數參數);

函數參數可以用查詢的表格數據作爲參數

select 函數名(表格屬性) from 表格名

刪除函數

drop function 函數名;

存儲過程和函數的區別

1.函數只能返回一個變量,而存儲過程可以返回多個;
2.函數的限制比較多,不能用臨時表(select),只能用表變量,存儲過程限制少;
3. 存儲過程處理的功能比較複雜,而函數實現的數據科學計算針對性強;
4.存儲過程可以執行修改表的操作,但是函數不能執行一組修改全局數據庫狀態的操作;
5.存儲過程可以通過out返回多個參數,如記錄集,函數只能返回值或者表對象

總結

1.存儲過程的使用
2.函數的使用
3.函數和存儲過程的區別

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章