2011-12-14 61 views
6

我有一個是這樣的一個過程:MySQL中的程序在選擇?

mysql> call Ticket_FiscalTotals(100307); 
+---------+--------+----------+------------+------------+ 
| Service | Items | SalesTax | eTaxAmount | GrandTotal | 
+---------+--------+----------+------------+------------+ 
| 75.00 | 325.00 | 25.19 | 8.00  | 433.19  | 
+---------+--------+----------+------------+------------+ 
1 row in set (0.08 sec) 

我想內選擇從調用這個過程,就像這樣:

SELECT  Ticket.TicketID as `Ticket`, 
Ticket.DtCheckOut as `Checkout Date/Time`, 
CONCAT(Customer.FirstName, ' ', Customer.LastName) as `Full Name`, 
Customer.PrimaryPhone as `Phone`, 

(CALL Ticket_FiscalTotals(Ticket.TicketID)).Service as `Service` 

FROM Ticket 
INNER JOIN Customer ON Ticket.CustomerID = Customer.CustomerID 
ORDER BY Ticket.SiteHomeLocation, Ticket.TicketID 

不過,我知道,這是痛苦的錯誤。有人能指點我的方向嗎?我將需要訪問過程中的所有列,以便在最終的Select中進行(加入?)。該過程中的SQL代碼相當痛苦,因此首先它的原因!

+0

嘗試使用用戶定義的函數。您不能在查詢中使用過程,但可以使用udfs。 – pavanred 2011-12-14 06:03:59

+0

@pavanred - 我的印象是UDF只能返回一個值,而不是整行? – Fuginator 2011-12-14 06:08:10

回答

7

的Ticket_FiscalTotals過程返回數據,其中一些字段設置,但你只需要一個人 - Service。將程序重寫爲存儲的功能 - Get_Ticket_FiscalTotals_Service

另一種方法是創建和程序填寫臨時表,並添加這個臨時的查詢,例如:

DELIMITER $$ 

CREATE PROCEDURE Ticket_FiscalTotals() 
BEGIN 
    DROP TEMPORARY TABLE IF EXISTS temp1; 
    CREATE TEMPORARY TABLE temp1(
    Service FLOAT(10.2), 
    Items FLOAT(10.2), 
    SalesTax FLOAT(10.2), 
    eTaxAmount FLOAT(10.2), 
    GrandTotal FLOAT(10.2) 
); 
    INSERT INTO temp1 VALUES (75.0, 325.0, 25.19, 8.0, 433.19); 
END 
$$ 

DELIMITER ; 

-- Usage 
CALL Ticket_FiscalTotals(); 
SELECT t.*, tmp.service FROM Ticket t, temp1 tmp; 
+0

感謝您的意見。我在上面說過,我需要訪問過程中的所有列,以便在最終的Select_中進行(加入?),這意味着我確實需要Service,Items,SalesTax,eTaxAmount和GrandTotal進入決賽桌。請問溫度。如果在外部Select中有幾百個結果,那麼表必須產生幾百次? (在Ticket表格中) - 如果是這樣,請遵循創建temp的過程。表還需要在Select中調用? (重新生成的臨時表)。再次感謝您的輸入 - 這正在變成很痛苦... – Fuginator 2011-12-14 06:49:33

7

你不能直接加入到存儲過程。你可以加入到臨時表,這個存儲過程填充:

  1. 創建臨時表,
  2. 執行SP,在您的臨時表填充數據,
  3. 加入到臨時表中查詢,
  4. 下降臨時表。

當然這不是一條線的解決方案。

的另一種方式(更糟糕的在我看來),我認爲是有儘可能多的UDF在SP結果集列,這可能看起來像休耕代碼:

SELECT 
    Ticket.TicketID as `Ticket`, 
    Ticket.DtCheckOut as `Checkout Date/Time`, 
    CONCAT(Customer.FirstName, ' ', Customer.LastName) as `Full Name`, 
    Customer.PrimaryPhone as `Phone`, 

    Ticket_FiscalTotals_Service(Ticket.TicketID) as `Service`, 
    Ticket_FiscalTotals_Items(Ticket.TicketID) as `Items`, 
    Ticket_FiscalTotals_SalesTax(Ticket.TicketID) as `SalesTax`, 
    Ticket_FiscalTotals_eTaxAmount(Ticket.TicketID) as `eTaxAmount`, 
    Ticket_FiscalTotals_GrandTotal(Ticket.TicketID) as `GrandTotal` 

FROM Ticket 
INNER JOIN Customer ON Ticket.CustomerID = Customer.CustomerID 
ORDER BY Ticket.SiteHomeLocation, Ticket.TicketID