2012-09-17 4 views
5

誰かが助けられると思っています。私は最初のストアドプロシージャー(何も気にしない)を作成しましたが、問題にぶち当たっています。MYSQL - コンマで区切られた文字列を変数入力として使用するストアドプロシージャ

-- -------------------------------------------------------------------------------- 
-- Routine DDL 
-- Note: comments before and after the routine body will not be stored by the server 
-- -------------------------------------------------------------------------------- 
DELIMITER $$ 

CREATE PROCEDURE `moments`.`new_procedure`(IN var1 VARCHAR(255)) 
BEGIN 

SELECT * FROM moments.PRODUCT WHERE EAN IN (var1); 

END 

イム午前:私はそれを、このような1,2,3,4,5として文字列の入力を与えたい

は、それが簡単なSELECT * FROM [TABLE] WHERE EAN IN (VAR);

を行いますので、ストアドプロシージャは、次のようになりますこのようようにそれを実行しようとしている:

作品

call moments.new_procedure('5045318357397') 

call moments.new_procedure('5045318357397,5045318357427'); 

機能しないこれが実行されるが、任意の結果を持ち帰るないdoesntの。

select * from moments.PRODUCT WHERE EAN IN ('5045318357397,5045318357427') 

はなく、この:その本やって、それは文字列として第2の文をクラス分けされ

select * from moments.PRODUCT WHERE EAN IN ('5045318357397','5045318357427') 

をどのように私はそれを取るために得ることを実行したクエリでの入力をフォーマットする必要がありませんコンマ区切りの文字列を入力として使用しますか?あなたが使用することができ

PREPARE stmt1 FROM CONCAT('select * from moments.PRODUCT WHERE EAN IN (',var1,')'); 
EXECUTE stmt1; 

答えて

12

:あなたが渡された文字列を想定し

+0

これは、格納されたproc内で完璧に動作します。ありがとうございます。これは、私がCast Ironアプリケーションから呼び出す方法でもあります。これは追加ボーナスです。 – MMKD

+2

これはうまくいきますが、テーブルからすべての行をフェッチして各行をセットと比較する必要があるので効率的ではありません。また、一致するかどうかを確認するためにコンマ区切りリストをループしなければなりません。 #列の数が少ない場合は、それ以外の場合はバッターの方法を見つけるべきです – Populus

+0

@Populusのコメントをもっと根絶する必要があります - FIND_IN_SETはテーブルインデックスを使用しないため、この方法で使用すると大きなパフォーマンス上の問題が発生する可能性があります –

1

が何らかの形で検証され、悪質なSQLが含まれていない、あなたは、プリペアドステートメントを使用することができます

SELECT * FROM moments.PRODUCT 
WHERE FIND_IN_SET(EAN, var1) 

をこれを想定して動作するはずです実際はコンマで区切られています。この場合、他の区切り文字は使用できません。

関連する問題