MySql必知必會實戰練習(五)存儲過程


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 ;


免責聲明!

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



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