3

入力パラメーターを使用して MySQL ストアド プロシージャ (SP) を作成したいと考えています。

ただし、SP の作成時点ではパラメーターの数を決定することはできません。(シナリオは、ユーザーが選択する複数のオプションを持つことです。選択されたオプションは、検索基準を形成します。

select ... 
where prod_category = option1 && option2 && option3 &&...

したがって、オプション 1 とオプション 2 のみを選択した場合、2 つのパラメーターのみが送信されます。場合によっては、50 以上のオプションが選択されることがあるため、50 以上のパラメーターを送信する必要があります。)

そこで、3 つの質問があります。 1. MySQL ストアド プロシージャ (SP) を使用して、このようなシナリオを処理できますか? 2. SP は、そのようなシナリオを処理するための専門的な方法ですか? 3. SP がこれらのシナリオを処理するための専門的な方法ではない場合、これらの検索を効率的に処理する方法は他にありますか? 検索は、私のアプリケーションのコア機能です。

助けてくれてありがとう!

4

2 に答える 2

2

MySQL ストアド プロシージャは、固定数の引数のみを受け入れます。単一の文字列パラメーターで区切られたパラメーターと値のリストを作成し、それらをプロシージャーで処理するか、代わりにアプリケーション言語を使用してクエリを作成することができます。

http://forums.mysql.com/read.php?98,154749,155001#msg-155001から

いいえ、MySQL sproc は固定数の引数のみを受け入れます。ISO SQL は正しい RDBMS ロジック向けにいくらか最適化されていますが (EF Codd、CJ Date、または Fabian Pascal に尋ねた場合を除きます)、多くの点で SQL は完全にリテラルです。デザインに別の外観が必要である可能性があります。この場合、複数のアドホックな削除を繰り返す必要があるデザインの側面です。

そのような削除が避けられない場合は、次の 3 つのオプションがあります。まず、アプリケーション言語で削除クエリを作成し、ID のコンマ区切り文字列を含めます。次に、そのような文字列を使用してクエリを PREPARE する sproc にそのような文字列を渡します。3 番目に、一時テーブルにターゲット ID を設定し、結合された ID を削除する単純な結合クエリを記述します。

于 2012-09-17T17:31:36.917 に答える
1

ストアド プロシージャを使用する大きな理由はたくさんあります。その一部をまとめた記事です。それが「プロフェッショナリズム」の問題に対処することを願っています。

パラメータの受け渡しに関しては、変数リストを使用できるとは思いません。

昔、値をテーブルに書き込み、ストアド プロシージャに値を読み込ませることで「完了」したことがわかりました (テーブルで session_id を使用し、それをプロシージャに渡します)。

「効率」に関しては、あなたの定義に依存します。ストアド プロシージャにはわずかな速度の利点があるかもしれませんが、私はそれについて心配しません。どういう意味?

于 2012-09-17T17:31:38.093 に答える