2010-12-20 12 views
2

時間範囲をフィルタリングする複雑なSELECTクエリがあります。この時間範囲(開始日と終了日)をユーザー指定のパラメータを使用して指定します。だから私はこれを行うストアドプロシージャを使用することができ、戻り値は複数行の結果セットです。私が抱えている問題は、後でこの結果セットを処理する方法です。ストアドプロシージャは、単にパラメータを取りSELECTであってもストアドプロシージャからのデータの選択

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

:私のような何かを行うことはできません。サーバーサイドの準備済みステートメントも動作しません(永続的でもありません)。 一時テーブルを使用することをお勧めする人もいます。理想的な解決策ではない理由は、1)私はテーブルスキーマを指定したくないし、そうする必要があると思われます.2)一時テーブルの有効期間はクエリの呼び出しに限られます。それを超えて持続する必要はありません。

要約すると、永続的なプリペアドステートメントのようなものが欲しい。サーバー側は、その戻り値がMySQLがサブクエリのように操作できる結果セットである。何か案は?ありがとう。

ところで、私はMySQL 5.0を使用しています。私はそれがかなり古いバージョンだと知っていますが、この機能はそれ以上の新しいバージョンには存在していないようです。他のSQLエンジンでストアドプロシージャからSELECTを実行できるかどうかはわかりません。切り替えは現時点では選択肢ではありませんが、私が将来切り替えることを決めた場合には、それが可能かどうかを知りたいと思います。

+0

ストアドプロシージャを必要に応じてサブクエリとして呼び出すことはできないため、状況によってはビューを使用できますか? – DTest

+0

ビューが機能しない理由は、サブクエリがパラメータを取り込むためです。ビューでは、クエリ全体を設定する必要があります。 –

答えて

1

他のエンジンでは、from関数を選択することができます。たとえば、Oracleでは、ユーザー定義型の表を戻す関数を記述できます。関数内に結果セットを定義し、クエリを使用して結果セットを設定したり、選択とコードの組み合わせを使用したりすることもできます。最終的に、結果セットは、関数から返すことができ、あなたが使用して、その上でクエリを実行し続けることができます:

select * from table(FunctionToBeCalls(parameters)); 

唯一の欠点は、この結果セットがインデックス化されていないされていること、それがあれば遅いかもしれません関数は複雑なクエリ内で使用されます。

MySQLではこのようなことはありません。選択クエリで直接プロシージャの結果セットを使用する方法はありません。関数から単一の値を返すことができ、値を返す手続きにはOUTまたはINOUTのパラメータを使用できます。 しかし、結果セット全体は不可能です。プロシージャ内で一時テーブルを埋めることは、あなたが得る最も近いものです。

+1

完全性のために:PostgreSQL、SQL Server、およびDB2で "テーブル関数"も可能です。 –

+1

これらをすべてリストする場合は、Firebird/Interbaseをリストに追加してください –

関連する問題