2011-12-14 13 views
6

Ho un procedimento che funziona in questo modo:Procedura MySQL all'interno di una selezione?

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) 

vorrei chiamare questa procedura all'interno di un prescelto, in questo modo:

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 

però so che questo è dolorosamente sbagliata. Qualcuno può indicarmi la giusta direzione? Avrò bisogno di accedere a tutte le colonne dalla procedura per essere (unita?) Nell'ultima selezione. Il codice SQL all'interno di quella procedura è piuttosto doloroso, quindi la ragione per la prima volta!

+0

Provare a utilizzare funzioni definite dall'utente. Non è possibile utilizzare le procedure in una query ma è possibile utilizzare udfs. – pavanred

+0

@pavanred - Avevo l'impressione che una UDF potesse restituire solo un valore, non un'intera riga? – Fuginator

risposta

7

La procedura Ticket_FiscalTotals restituisce un set di dati con alcuni campi, ma è necessario uno solo di essi - Service. Riscrivi la tua procedura per la funzione memorizzata - Get_Ticket_FiscalTotals_Service.

Un altro modo è quello di creare e compilare tabella temporanea nella procedura, e aggiungere questo temporanea a una query, ad es .:

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

Grazie per l'input. Ho affermato sopra che _I bisogno di accedere a tutte le colonne dalla procedura per essere (unito?) Nella selezione finale_, il che significa che ho bisogno di servizio, articoli, SalesTax, eTaxAmount e GrandTotal nella tabella finale. Sarà la temp. la tabella deve essere generata diverse centinaia di volte se ci sono centinaia di risultati nella selezione esterna? (nella tabella Ticket) - e in caso affermativo, sustra la procedura che crea il temp. la tabella deve anche essere chiamata all'interno del Select? (per rigenerare la tabella temp.) Ancora una volta, grazie per il tuo contributo - questo si sta trasformando in una vera sofferenza ... – Fuginator

+0

Una tabella temporanea verrà generata una volta - quando chiami la procedura Dopo, sarai in grado di usare questo tenp . tabella molte volte (nota, la tabella temp è accessibile solo alla sessione corrente). – Devart

7

Non è possibile partecipare direttamente alla stored procedure. È possibile aderire alla tabella temporanea che questa stored procedure riempie:

  1. creare tabella temporanea,
  2. eseguire SP che riempie i dati nella tabella temporanea,
  3. unirsi alla tabella temporanea nella query,
  4. goccia tavolo temporaneo.

Ovviamente non è una soluzione di linea.

L'altro modo (peggio a mio parere) mi viene in mente è di avere il maggior numero UDF come colonne in SP set di risultati, questa potrebbe apparire come codice di fermo degli impianti:

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 
+0

Grazie per l'input, ho finito con l'utilizzo di una soluzione di visualizzazione nidificata, poiché le prestazioni si sono rivelate migliori rispetto alla mia configurazione. Grazie ancora per il tuo contributo. – Fuginator

Problemi correlati