2012-11-12 76 views
1

假設我有這個功能sp_func(startdate, enddate)。 要調用函數本身,我使用CALL sp_func(startdate, enddate);Informix:如何平均來自存儲過程的結果

該函數將返回一個表,包括:

id name  time 
1 smith  3.2 
2 neo  8.2 
3 morpheus 2.4 

我想要做的就是從功能平均的時間。 我試過SELECT AVG(time) FROM sp_func(startdate, enddate),但沒有奏效。發生語法錯誤。我不確定這是什麼確切的語法。任何幫助是極大的讚賞。

回答

0

魔術關鍵字是TABLE。這裏有一個腳本演示解決方案:

啞過程

CREATE PROCEDURE sp_func(begin_date DATE, end_date DATE) 
    RETURNING INTEGER AS id, VARCHAR(10) AS NAME, DECIMAL(5,2) AS TIME; 

    RETURN 1, "smith",  3.2 WITH RESUME; 
    RETURN 2, "neo",  8.2 WITH RESUME; 
    RETURN 3, "morpheus", 2.4; 

END PROCEDURE; 

EXECUTE PROCEDURE sp_func('2012-01-01', '2012-12-31'); 

輸出

1 smith  3.20 
2 neo  8.20 
3 morpheus 2.40 

主要SELECT語句

SELECT AVG(a.TIME) 
FROM TABLE(PROCEDURE sp_func('2012-01-01', '2012-12-31')) AS A(id, name, time) 
; 

輸出

4.6 

帶有列名稱的AS子句是必需的,即使過程命名了它的返回值。

此語法在第2章的SELECT語句下的Informix SQL指南:語法手冊中進行了介紹,子標題是'Iterator Functions(IDS)'(ids-sqs_bookmap副本中的p2-638我有11.70的.pdf)。

+0

感謝您的清理和答覆。我能夠運行你的虛擬功能,並選擇很好。但是當我嘗試使用SP時,我在spl例程中收到了非法的sql語句。順便說一句,a.TIME < - 爲什麼'時間'需要用大寫字母?我檢查了sp_func的位置,它位於'FUNCTION'文件夾中,而不是在TABLE文件夾中。這是問題的原因嗎? – johndoe

+0

TIME不需要大寫; SQL不區分大小寫。我只有一個SQL格式化程序,它將TIME作爲關鍵字進行識別,並且我沒有轉換爲小寫或混合大小寫。有些語句在將用作迭代函數的例程中是不允許的。我認爲更新操作是被禁止的。所以可能是DDL語句。鑑於程序的主體,我可能很快就會猜出哪個是令人頭痛的陳述。功能與程序的選擇是AFAIK,基本上不重要。 –