Процедура MySQL в Select? - PullRequest
       27

Процедура MySQL в Select?

6 голосов
/ 14 декабря 2011

У меня есть процедура, которая работает так:

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

Однако я знаю, что это ужасно неправильно. Может кто-нибудь, пожалуйста, укажите мне правильное направление? Мне понадобится доступ ко всем столбцам из процедуры, которая будет (присоединена?) В окончательном выборе. Код SQL в этой процедуре довольно болезненный, поэтому причина этого в первую очередь!

Ответы [ 2 ]

8 голосов
/ 14 декабря 2011

Процедура 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;
7 голосов
/ 14 декабря 2011

Вы не можете напрямую присоединиться к хранимой процедуре.Вы можете присоединиться к временной таблице, которую заполняет эта хранимая процедура:

  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
...