2008-08-12 15 views
13

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

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

答えて

8

This記事はいくつかの良い議論があります。

  • ユニークID(GUID)
  • アイテムID

擬似コードは次のようになります。私は2つのフィールドを持つ別のテーブルには、持っていますストアド・プロシージャは有効な表の列データ型のみをパラメータとして許可するため、ストアド・プロシージャへの配列の解析に関する問題について説明します。

csvテーブルタイプでmysqlにできることがいくつかあります。つまり、フラットファイルをdbにロードする場合です。

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

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

0

これらがSPで具体的に機能するかどうかは不明ですが、MySQL 5ではENUMとSETのデータ型が必要な場合があります。選択肢、C#の私のプログラミング言語で http://dev.mysql.com/doc/refman/5.0/en/enum.html http://dev.mysql.com/doc/refman/5.0/en/set.html

+0

enumsとsetは文字列にのみ適用されます。列挙型は集合から1つの値しか許さないので、可変数の値を許可しないでください。私はまた、SETデータ型がストアドプロシージャであらかじめ定義されていなければならないと考えています。 – beldaz

0

スプリット()関数やループはしかし、その後、C#でSQLをプログラムするのが容易であるので、私は実際にアプリケーション自体でこれを行います!

おそらくSubString_Index()の機能を見てください。

たとえば、次のようなGoogleが返されます:

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

あなたが取得したいどのように複雑に応じて、一般的なリンクテーブルを使用することができます。私のアプリケーションの1つとして、コンボボックスからの単一の顧客ではなく、レポートを実行する顧客のリストなど、ユーザーが選択できるいくつかのレポートがあります。

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  
関連する問題