1. 程式人生 > 其它 >主成分分析

主成分分析

建立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;
惜秦皇漢武,略輸文采;唐宗宋祖,稍遜風騷。 一代天驕,成吉思汗,只識彎弓射大雕。 俱往矣,數風流人物,還看今朝