MySQL之存儲過程


四:存儲過程 (優先掌握)

1. 什么是存儲過程

是任意的sql語句的組合,被放到某一個存儲過程中,類似於一個函數,有一個函數,有參數,還是函數體

2. 為什么使用存儲過程

包含任何的sql語句,邏輯處理,事務處理。所有的我們學過的sql都可以放到里面

3. 三種開發方式的對比

第一種:應用程序只關注業務邏輯,所有與數據相關的邏輯封裝到mysql中

​ 優點:應用程序要處理的事情變少了,可以減少網絡傳輸

​ 缺點:增加了人力成本和溝通成本,降低了開發效率

第二種:應用程序既要處理業務邏輯,還有自己編寫sql語句

​ 優點:降低了溝通成本,人力成本

​ 缺點:網絡傳輸增加,sql語句編寫非常繁瑣,易出錯

第三種:通過ORM框架。對象關系映射,自動生成sql語句並執行

​ 優點:簡化編寫sql語句的過程,提升了開發速度

​ 缺點:不夠靈活。數據庫和應用程序開發者完全隔離,可能導致開發者僅關注上層開發,而不清楚底層原理

4. 如何使用存儲過程
1. 語法
-----------創建--------
create procedure pro_name(p_Type p_name data_type)
begin
sql語句 ... 流程控制
end

-----------參數---------------
p_Type:
	in 輸入
	out 輸出
	inout 輸入輸出
p_name	參數的名字
data_type:參數的數據類型 如 int float

-----------刪除----------------
drop procedure pro_name;

-----------查看----------------
show create procedure pro_name;

-----------查看某個庫中的所有存儲過程----------------
select name from mysql.proc where db = "庫名" and type = "procedure";

select name from mysql.proc where db = "day41_1" and type = "procedure";


# 測試數據
create table account(id int primary key auto_increment,name char(10),money float);
insert into account values(null,"big",1000),(null,"dog",2000),(null,"cat",3000),(null,"me",0);


2. 示例
---------------------示例1-----------------------
delimiter //
create procedure plf(in a int,in b int,out c float)
begin
set c = a + b;
end //
delimiter ;

set @res = 0;		# 設置變量
call plf(1,2,@res);	# 調用該存儲對象。ps:out類型的數據,在調用時必須給定變量。


---------------------示例2-----------------------
// 我們需要把將更新語句寫錯,同時讓其自動觸發一個異常報錯,然后執行回滾操作
delimiter //
create procedure transfer(in aid int,in bid int,in m float,out p_return_code int)
begin
	DECLARE exit handler for sqlexception
	BEGIN
		# ERROR
		set p_return_code = 1;
		rollback;
	END;
	# exit 也可以換成continue 表示發生異常時繼續執行
	DECLARE exit handler for sqlwarning 
	BEGIN 
        # WARNING 
        set p_return_code = 2; 
        rollback; 
    END; 
	
	
	# 事務執行
	START TRANSACTION; 
	update account set money = money - m where id = aid;
	# 故意將money字段寫錯,讓其執行報錯,從而執行上面的異常捕捉中的代碼
	update account set moneys = money + m where id = bid;
	COMMIT;
	
	# 如果成功,p_return_code為0
	set p_return_code = 0;
	
end //
delimiter;


set @p_return_code = 10;	// 需要提前設置變量
call transfer(1,2,100,@p_return_code);	# 1,2分別為account表中對應的id,100為錢,@p_return_code代表上面的變量


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM