1. 為什么使用存儲過程?
(1) 通過把處理封裝在容易使用的單元中,簡化復雜操作
(2) 為了保證數據的完整性,不要求反復建立一系列的處理操作,所有開發人員和應用程序都使用同一(試驗和測試)存儲過程,則所使用的代碼否的相同的,這一點的延申就是為了防止錯誤,保證數據的一致性
(3)提高性能,因為使用存儲過程比使用單獨的SQL語句要快
(4)存儲功能可以編寫功能更強更靈活的代碼
一句話,既簡單、安全又高性能
2. 創建存儲過程
create procedure product_price() begin select Avg(proc_price) as priceaverage from products; end;
調用:
call product_price()
輸出:
是不是很簡單,下面使用返回值創建存儲過程
drop procedure product_price; create procedure product_price( OUT pa decimal(8,2) ) begin select Avg(proc_price) into pa from products; end; call product_price(@priceaverge); select @priceaverge
下面是參數和返回值創建存儲過程
drop procedure IF EXISTS product_price; create procedure product_price( IN number int, OUT sum decimal(8,2) ) begin select Sum(proc_price) into sum from products where vend_id = number; end; call product_price(1003, @pricesum); select @pricesum;
3. 復雜存儲過程展示
使用先前創建的orderitems表
需求:
通過order_num計算該訂單號的產品總價,再根據是否交稅情況返回最終價格
create procedure orderprice( in ordernum int, in istax boolean, out sumprice decimal(8,2) ) begin declare taxrate int default 6; select Sum(quantity * item_price) into sumprice from orderitems where order_num = ordernum; if istax then select sumprice+(sumprice*taxrate/100) into sumprice; end if; end;
測試:
call orderprice(20005,0,@sumprice); select @sumprice;
call orderprice(20005,1,@sumprice); select @sumprice;
4. 對於使用mysql命令行進程存儲操作的補充
由於mysql命令行使用;作為語句分隔符,如果命令行要解析存儲過程的;字符,則它們最終不會成為存儲過程的成分,這會使存儲過程中的sql出現句法錯誤。
可以采用下列方法進行解決:
DELIMITER // create procedure product_price() begin select Avg(proc_price) as priceaverage from products; end // DELIMITER ;
DELIMITER // 告訴命令行實用程序使用//作為新的語句結束分隔符,最后再還原為DELIMITER ;