MySQL ストアド プロシージャにリスト データ型、またはそれらをエミュレートする方法はありますか?

StackOverflow https://stackoverflow.com/questions/8795

  •  08-06-2019
  •  | 
  •  

質問

MySQL でリストを引数として受け取るストアド プロシージャを作成したいと考えています。たとえば、1 回の呼び出しで 1 つのアイテムに複数のタグを設定できるようにしたいとします。その場合、アイテムの ID と設定するタグのリストを受け取るプロシージャを定義する必要があるとします。しかし、これを行う方法が見つからないようです。私の知る限りリストデータ型はありませんが、何らかの方法でエミュレートできますか?タグのリストはカンマ区切りの文字列であり、何らかの方法で分割してループすることができるのでしょうか?

通常、MySQL ストアド プロシージャでリストをどのように操作しますか?

役に立ちましたか?

解決

これ この記事では、ストアド プロシージャでは有効なテーブル列のデータ型のみがパラメーターとして許可されるため、配列をストアド プロシージャに解析する問題についていくつかの良い議論が行われています。

を使ってできることがいくつかあります。 csv mysql のテーブル タイプ - つまり、フラット ファイルをデータベースにロードしている場合です。

ストアド プロシージャで一時テーブルを作成し、CSV リストを反復処理して一時テーブルに挿入し、そのテーブルから値を選択するカーソルを作成できます。これ 答え 上記のスレッドでは、これを行う方法が示されています。

通常、データベースにアクセスする前に配列を分割し、各項目に対して個別にクエリを実行します。

他のヒント

どれだけ複雑にするかに応じて、汎用のリンク テーブルを使用できます。私のアプリケーションの 1 つには、ユーザーが選択できるレポートがいくつかあります。たとえば、コンボ ボックスから 1 人の顧客だけを選択するのではなく、レポートを実行する顧客のリストなどです。2 つのフィールドを持つ別のテーブルがあります。

  • UniqueID (ガイド)
  • アイテムID

擬似コードは次のようになります。

GUID guid = GenerateGUID()
try
  for each customer in customerList { INSERT(guid, customerId) }
  ExecuteSQLPocedure(guid)
  --the procedure can inner-join to the list table to get the list
finally
  DELETE WHERE UniqueID=guid      

私の選択したプログラミング言語である C# では、split() 関数とループは SQL よりも C# でプログラムする方が簡単であるため、実際にはアプリケーション自体でこれを行っています。

おそらくあなたは見るべきです SubString_Index() 関数。

たとえば、次の場合は google が返されます。

SELECT SUBSTRING_INDEX(SUBSTRING_INDEX('www.google.com', '.', -2), '.', 1);

これらが特に SP で機能するかどうかはわかりませんが、MySQL 5 には ENUM および SET データ型があり、必要なことを実行できる可能性があります。http://dev.mysql.com/doc/refman/5.0/en/enum.html http://dev.mysql.com/doc/refman/5.0/en/set.html

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top