四:存儲過程 (優先掌握)
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代表上面的變量