0

非常に複雑な結合を作成し、1行のデータを返すストアドプロシージャがあります(LIMIT 1が使用されています)。私のアプリケーションでは、そのデータを使用して計算を行っています。このようにして、ビジネスロジックをストアドプロシージャから保護しようとします。 しかし、今私はいくつかの計算を行うために、別のストアド関数でそのデータを取得する必要があります。ストアド・ファンクションを作成する理由は、何千もの行を戻す別の問合せで呼び出されるためです。MySQL:ストアドプロシージャの結果をストアドファンクション内で取得する方法は?

可能ですか?私はストアドファンクションの複雑な結合ロジックを複製したくない... 私が見る唯一の解決策は、出力パラメータを使用することです。


----------------------------
PS。私はあなたに私の状況を説明することを決めました、多分あなたは私に別の決定を提供します。

商品の納期払い価格(梱包、配送、通関を含む最終価格)を計算する必要があります。この配達義務の支払い価格の計算は少し複雑で、私はストアドプロシージャと関数に複雑なロジックを保持したくありません。そこで私は、価格の計算に必要なすべてのデータを選択するストアドプロシージャを作成し、そのデータをアプリケーションで使用して価格を計算します。今のところすべてがうまくいく。

しかし、今私は納期払い価格で価格表を作成する必要があります。私たちは何千もの商品を持っています。だから、商品の平和のために私のストアドプロシージャを呼び出すと、何千ものラウンドトリップ(クエリ)がサーバーにかかるでしょう。そのため、ストアドプロシージャを呼び出し、返されたデータに基づいて価格を計算する関数を作成する必要があります。そして、私はこれを次のように使いたい:
SELECT説明、blablabla、Weight、...、GetDeliveryDutyPaidPrice(...)FROM pricelist;

アイデア?

答えて

1

ストアドプロシージャの代わりに、ビューにします。それはあなたの問題を解決するはずです。

EDIT:

正確には何がやりたいことは、あなたの計算に使用する列の全てを含むビューを作成することです。ビューは、基礎となるDBエンジンがそのパフォーマンスを最適化できるようにするという点でストアドプロシージャに似ていますが、WHERE句を使用して通常のテーブルと同じ方法でクエリできます。したがって、テーブルの基本的な実装では、各テーブルに必要な列のみを持つことができます(スキーマをシンプルにする)が、ビューは異なるテーブルのすべての列を単一の「テーブルビュー」に構成できます。 WHERE句。このようにして、ストアド・プロシージャの利点(一般的に使用されるジョインのSQL結合を最適化する)を実現し、データベースのロジックを引き続き維持しながら結果を適切にフィルタリングできるようになります(WHERE句を使用)。

本当に。ビューは非常に非常に良いことです。それらを使用してください。

+0

私はそのストアドプロシージャの入力パラメータを持っています。ビューはどのように役立ちますか?もっと詳しく説明できますか? – nightcoder

+0

そのストアドプロシージャの入力パラメータは何ですか?出力行を生成するための入力パラメータが必要な場合は、ストアドプロシージャからビジネスロジックを維持することに本当に成功しましたか? –

+0

まあ、入力パラメータはjoinとwhere句にのみ必要です – nightcoder

関連する問題