2011-12-14 32 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