2010-12-20 158 views
2

我有一個複雜的SELECT查詢過濾時間範圍,我希望這個時間範圍(開始和結束日期)可以使用用戶提供的參數指定。所以我可以使用存儲過程來做到這一點,而返回是一個多行結果集。我遇到的問題是如何處理這個結果集。我不能這樣做:從存儲過程中選擇數據

SELECT * FROM (CALL stored_procedure(start_time, end_time)) 

即使存儲過程只是一個SELECT是需要的參數。服務器端準備好的語句也不起作用(並且它們也不是持久的)。有些人建議使用臨時表;這不是一個理想的解決方案的原因是:1)我不想指定表模式,似乎你必須,2)臨時表的生命週期只限於調用查詢,它除此之外不需要堅持。

因此,我想要一個類似於持久預備語句服務器端的東西,它的返回值是MySQL可以像操作子查詢一樣操作的結果集。有任何想法嗎?謝謝。

順便說一句,我使用MySQL 5.0。我知道這是一個非常老的版本,但是這個功能似乎並不存在於任何更新的版本中。我不確定是否可以在其他SQL引擎中使用存儲過程進行SELECT;切換不是目前的選擇,但我想知道是否有可能,以防我們決定在未來切換。

+0

由於無法像存儲過程那樣調用存儲過程,因此您的情況可能會使用視圖嗎? – DTest 2010-12-20 22:54:55

+0

視圖不起作用的原因是因爲我希望子查詢獲取參數,而在視圖中需要設置整個查詢。 – 2010-12-21 20:30:22

回答

1

從其他引擎中可以選擇功能。例如,Oracle允許您編寫一個返回用戶定義類型表的函數。您可以在函數中定義結果集,使用查詢或使用選擇和代碼的組合來填充結果集。最終,結果集可以從函數返回,您可以繼續使用上查詢:

select * from table(FunctionToBeCalls(parameters)); 

唯一的缺點是,這個結果集沒有被索引,所以它可能是,如果慢函數用於複雜的查詢中。

在MySQL中沒有這樣的可能。無法直接在選擇查詢中使用過程中的結果集。您可以從函數返回單個值,並且可以使用OUTINOUT參數向您返回值。 但是整個結果集是不可能的。在您的程序中填寫一張臨時表是最接近您的程序。

+1

只是爲了完整性:「表函數」也可以在PostgreSQL,SQL Server和DB2中使用 – 2010-12-20 22:44:23

+1

好吧,如果要全部列出它們,然後將Firebird/Interbase添加到列表中 – 2013-04-24 14:04:13