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

は、しかし、私は、これは痛いほど間違っていることを知っています。誰かが正しい方向で私を指差してくれますか?最終的な選択で(結合される)手順からのすべての列にアクセスする必要があります。そのプロシージャ内のSQLコードはむしろ痛いので、最初はその理由です!

+0

ユーザー定義関数を使用してみてください。クエリでプロシージャを使用することはできませんが、udfsを使用することはできます。 – pavanred

+0

@pavanred - UDFは行全体ではなく1つの値しか返すことができないという印象を受けましたか? – Fuginator

答えて

7

Ticket_FiscalTotalsプロシージャは、いくつかのフィールドを含むデータセットを返しますが、そのうちの1つ、つまり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にある場合は、テーブルを数百回生成する必要がありますか? (チケットテーブルの中に) - そうであれば、一時表を作成する手順を実行してください。テーブルもSelect内で呼び出す必要がありますか? (テンポラリテーブルを再生成するために)もう一度、あなたの入力をありがとう - これはかなりの痛みに変わっています... – Fuginator

+0

テンポラリテーブルは一度生成されます - プロシージャをコールすると、このテンポ。テーブルは何度も(メモ、一時テーブルは現在のセッションにのみアクセス可能です)。 – Devart

7

あなたがストアドプロシージャに直接参加することはできません。あなたは、このストアドプロシージャがいっぱいいることを一時テーブルに参加することができます:

  1. はドロップ
  2. があなたのクエリで一時テーブルに参加し、あなたの一時テーブルにデータを埋めSPを実行し、
  3. を一時テーブルを作成します一時テーブル。

もちろん、1行の解決策ではありません。 (私の意見で悪化)

他の方法は、私がのSPの結果セットの列は、これは休閑コードのように見えるかもしれないほど多くのUDF持つことだと思う:

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

入力していただきありがとうございます。代わりに、ネストされたビューソリューションを使用して巻きました。入力いただきありがとうございます。 – Fuginator