日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

mysql-存储过程

發布時間:2025/3/21 数据库 19 豆豆
生活随笔 收集整理的這篇文章主要介紹了 mysql-存储过程 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1、什么是存儲過程

為以后的使用而保存的一條或多條MySQL語句的集合。
存儲過程思想上就是數據庫 SQL 語言層面的代碼封裝與重用。

2、為什么要使用存儲過程

  • 把處理封裝在容易使用的單元中,簡化復雜的操作
  • 防止錯誤保證了數據的一致性
  • 簡化對變動的管理。(修改對應表名、列名等修改對應存儲過程的代碼,對于使用的人不需要知道變化)
  • 提高性能
  • 靈活
  • 總的來說是簡單、安全、高性能
    缺點:

  • 編寫比SQL語句復雜
  • 權限問題(可能無權、一般都是使用存儲過程、沒有創建存儲過程的權限)
  • 3、創建存儲過程

    CREATE PROCEDURE productpricing() BEGIN SELECT Avg(prod_price) AS priceaverage FROM products; END

    注意:在命令行中輸入的問題

    mysql> delimiter // mysql> CREATE PROCEDURE productpricing()-> BEGIN-> SELECT Avg(prod_price) AS priceaverage-> FROM products;-> END //

    4、使用存儲過程

    存儲過程實際上是一種函數

    CALL productpricing();

    4、刪除存儲過程

    drop procedure productpricing;drop procedure if EXISTS productpricing;

    5、使用參數

    一般,存儲過程并不顯示結果,而是把結果返回給你指定的變量
    變量(variable)內存中一個特定的位置,用來臨時存儲數據。

    CREATE PROCEDURE productpricing(OUT p1 DECIMAL(8,2),OUT ph DECIMAL(8,2),OUT pa DECIMAL(8,2) ) BEGIN SELECT MIN(prod_price) INTO p1 FROM products; SELECT MAX(prod_price) INTO ph FROM products; SELECT avg(prod_price) INTO pa FROM products; END;

    關鍵字OUT指出相應的參數用來從存儲過程傳出 一個值(返回給調用者)。
    MySQL支持IN(傳遞給存儲過程)、
    OUT(從存 儲過程傳出,如這里所用)
    INOUT(對存儲過程傳入和傳出)類型的參 數。

    變量名 所有MySQL變量都必須以@開始。
    調用存儲過程

    call productpricing(@pricelow,@pricehign,@priceaverage);

    查詢

    SELECT @priceaverage; SELECT @priceaverage,@pricehign,@pricelow;

    使用in和out
    創建

    CREATE PROCEDURE ordertotal(IN onumber INT,OUT ototal DECIMAL(8,2) ) BEGIN SELECT sum(item_price*quantity) FROM orderitems WHERE order_num = onumber INTO ototal; END;

    調用

    call ordertotal(20005,@total);

    查詢

    select @total;

    6、建立智能存儲過程

    迄今為止使用的所有存儲過程基本上都是封裝 MySQL簡單的SELECT語句。雖然它們全都是有效的存儲過程例子,但它們所能完成的工作你直接用這些被封裝的語句就能完成(如果說它們還能帶來更多的東西。那就是使事情更復雜)。只有在存儲過程內包含業務規則和智能處理時,它們的威力才真正顯現出來。

    考慮這個場景。你需要獲得與以前一樣的訂單合計,但需要對合計增加營業稅,不過只針對某些顧客(或許是你所在州中那些顧客)。那么,你需要做下面幾件事情:1、獲得合計(和以前一樣)2、把營業稅有條件的添加到合計3、返回合計(帶或不帶稅的)

    我們輸入如下代碼:

    -- Name: ordertotal // 添加注釋 -- Parameters: onumber = order number -- taxable = 0 if not taxable, 1 if taxtable -- ototal = order total variableCREATE PROCEDURE ordertotal ( IN onumber INT, IN taxable BOOLEAN, OUT ototal DECIMAL(8,2) ) COMMENT 'Obtain order total, optionally adding tax' BEGIN-- Declare variable for totalDECLARE total DECIMAL(8,2); // 聲明變量 -- Declare tax percentageDECLARE taxrate INT DEFAULT 6;-- Get the order totalSELECT Sum(item_price*quantity)FROM orderitemsWHERE order_num = onumberINTO total;-- Is this taxable?IF taxable THEN-- yes,so add taxrate to the totalSELECT total+(total/100*taxrate) INTO total;END IF;-- And finally, save to out variableSELECT total INTO ototal; END; 此存儲過程有很大的變動。首先,增加了注釋(前面放置 --)。在存儲過程復雜性增加時,這樣做特別重要。 添加了另外一個參數 taxable,它是一個布爾值(如果要增加稅則為真,否則為假)。 在存儲過程體中,用 DECLARE語句定義了兩個局部變量。 DECLARE要求指定變量名和數據類型, 它也支持可選的默認值(這個例子中的 taxrate的默認被設置為 6%)。SELECT 語句變,因此其結果存儲到 total(局部變量)而不是 ototal。 IF 語句檢查taxable是否為真,如果為真,則用另一SELECT語句增加營業稅到局部變量 total。最后,用另一SELECT語句將total(它增加或許不增加營業稅)保存到 ototal。 注意:COMMENT關鍵字 ,本例子中的存儲過程在 CREATE PROCEDURE語句中包含了一個 COMMENT值。 它不是必需的,但如果給出,將在SHOW PROCEDURE STATUS的結果中顯示。這顯然是一個更高級,功能更強的存儲過程。為試驗它,請用以下兩條語句: 第一條: call ordertotal(20005, 0, @total); SELECT @total; 輸出: +--------+ | @total | +--------+ | 38.47 | +--------+ 第二條: call ordertotal(20009, 1,@total); SELECT @total; 輸出: +--------+ | @total | +--------+ | 36.21 | +--------+ BOOLEAN值指定為1 表示真,指定為 0表示假(實際上,非零值都考慮為真,只有 0被視為假)。通過給中間的參數指定 0或1 ,可以有條件地將營業稅加到訂單合計上。

    這個例子給出了 MySQL的IF 語句的基本用法。 IF語句還支持 ELSEIF和ELSE 子句(前者還使用 THEN子句,后者不使用)。在以后章節中我們將會看到 IF的其他用法(以及其他流控制語句)。

    7、檢查存儲過程

    為顯示用來創建一個存儲過程的CREATE語句

    show create PROCEDURE ordertotal;

    為了獲得包括何時、由誰創建等詳細信息的存儲過程列表

    show procedure status;

    表比較多,用like過濾

    show procedure status like 'ordertotal';

    總結

    以上是生活随笔為你收集整理的mysql-存储过程的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。