主成分分析
建立MYSQL儲存過程
CREATE PROCEDURE productpricing()
BEGIN
SELECT Avg(prod_price) AS priceaverage
FROM products;
END;
此儲存過程名為productpricing ,用CREATE PROCEDURE productpricing() 語句定義。如果儲存過程接受引數,它們將在() 中列舉出來。此儲存過程沒有引數,但後跟的() 仍然需要。BEGIN 和END 語句用來限定儲存過程體,過程體本身僅是一個簡單的SELECT 語句
執行儲存過程
CALL productpricing();
刪除儲存過程
DROP PROCEDURE productpricing;
DROP PROCEDURE IF EXISTS productpricing
建立帶變數的儲存過
CREATE PROCEDURE productpricing( OUT pl DECIMAL(8,2), OUT ph DECIMAL(8,2), OUT pa DECIMAL(8,2) ) BEGIN SELECT Min(prod_price) INTO pl FROM products; SELECT Max(prod_price) INTO ph FROM products; SELECT Avg(prod_price) INTO pa FROM products; END;
此儲存過程接受3個引數:pl 儲存產品最低價格,ph 儲存產品最高價格,pa 儲存產品平均價格。每個引數必須具有指定的型別,這裡使用十進位制值。關鍵字OUT 指出相應的引數用來從儲存過程傳出一個值(返回給呼叫者)。MySQL支援IN (傳遞給儲存過程)、OUT (從儲存過程傳出,如這裡所用)和INOUT (對儲存過程傳入和傳出)型別的引數。儲存過程的程式碼位於BEGIN 和END 語句內,如前所見,它們是一系列SELECT 語句,用來檢索值,然後儲存到相應的變數(通過指定INTO 關鍵字)
執行帶引數的儲存過程
CALL productpricing(@pricelow, @pricehigh, @priceaverage);
由於此儲存過程要求3個引數,因此必須正好傳遞3個引數,不多也不少。所以,這條CALL 語句給出3個引數。它們是儲存過程將儲存結果的3個變數的名字。
變數名 所有MySQL變數都必須以@ 開始。
直接查詢變數 即顯示變數的返回值
SELECT @priceaverage;
SELECT @pricehigh, @pricelow, @priceaverage;
建立帶輸入引數和返回引數的儲存過程
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;
onumber 定義為IN ,因為訂單號被傳入儲存過程。ototal 定義為OUT ,因為要從儲存過程返回合計。SELECT 語句使用這兩個引數,WHERE 子句使用onumber 選擇正確的行,INTO 使用ototal 儲存計算出來的合計。
呼叫
CALL ordertotal(20005, @total);
建立複雜的儲存過程
-- Name: ordertotal
-- Parameters: onumber = order number
-- taxable = 0 if not taxable, 1 if taxable
-- ototal = order total variable
CREATE PROCEDURE ordertotal(
IN onumber INT,
IN taxable BOOLEAN,
OUT ototal DECIMAL(8,2)
) COMMENT 'Obtain order total, optionally adding tax'
BEGIN
-- Declare variable for total
DECLARE total DECIMAL(8,2);
-- Declare tax percentage
DECLARE taxrate INT DEFAULT 6;
-- Get the order total
SELECT Sum(item_price*quantity)
FROM orderitems
WHERE order_num = onumber
INTO total;
-- Is this taxable?
IF taxable THEN
-- Yes, so add taxrate to the total
SELECT total+(total/100*taxrate) INTO total;
END IF;
-- And finally, save to out variable
SELECT total INTO ototal;
END;
taxable ,它是一個布林值(如果要增加稅則為真,否則為假)。在儲存過程體中,用DECLARE 語句定義了兩個區域性變數。DECLARE 要求指定變數名和資料型別,它也支援可選的預設值(這個例子中的taxrate 的預設被設定為6% )。SELECT 語句已經改變,因此其結果儲存到total (區域性變數)而不是ototal 。IF 語句檢查taxable是否為真,如果為真,則用另一SELECT 語句增加營業稅到區域性變數total 。最後,用另一SELECT 語句將total (它增加或許不增加營業稅)儲存到ototal 。
執行
CALL ordertotal(20005, 0, @total);
SELECT @total;
IF 語句 這個例子給出了MySQL的IF 語句的基本用法。IF 語句還支援ELSEIF 和ELSE 子句(前者還使用THEN 子句,後者不使用)。
小知識
SHOW PROCEDURE STATUS
可以獲得包括何時、由誰建立等詳細資訊的儲存過程列表
遊標
前言
遊標只能用於儲存過程
使用遊標涉及幾個明確的步驟
- 在能夠使用遊標前,必須宣告(定義)它。這個過程實際上沒有檢索資料,它只是定義要使用的SELECT 語句
- 一旦聲明後,必須開啟遊標以供使用。這個過程用前面定義的SELECT 語句把資料實際檢索出來
- 對於填有資料的遊標,根據需要取出(檢索)各行
- 在結束遊標使用時,必須關閉遊標
建立遊標
CREATE PROCEDURE processorders()
BEGIN
-- Declare the cursor
DECLARE ordernumbers CURSOR
FOR
SELECT order_num FROM orders;
-- Open the cursor
OPEN ordernumbers;
-- Close the cursor
CLOSE ordernumbers;
END;
惜秦皇漢武,略輸文采;唐宗宋祖,稍遜風騷。
一代天驕,成吉思汗,只識彎弓射大雕。
俱往矣,數風流人物,還看今朝