2012-09-17 26 views
5

Birinin yardım edebileceğini umuyorum. İlk depolanmış prodüksiyonumu (hiçbir şey fantezi değil) oluşturdum, ancak bir sorunla karşılaşıyorum.MYSQL - Saklı Prosedür Değişken Giriş Olarak Virgülle Ayrılmış Dize Kullanan

ben o 1,2,3,4,5 o zaman basit bir SELECT * FROM [TABLE] WHERE EAN IN (VAR);

Yani saklı proc şöyle yapar gibi bir dize girişi vermek istiyorum:

-- -------------------------------------------------------------------------------- 
-- 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 

Im am böyle gibi yürütülmeye çalışılırken:

İşleri

call moments.new_procedure('5045318357397') 

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

Çalışmıyor Bu ancak herhangi bir sonuç geri getirmeyecek doesnt yürütür.

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

değil bu: onun bunu böylece bir dize olarak ikinci ifadeyi classing mı

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

Nasıl bir alması için yürütmek sorguda biçiminde giriş gerekiyor virgül bir giriş olarak dize ayrılmış? Sen kullanabilirsiniz

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

cevap

12

:

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

İşte bu varsayarak çalışması gerekir nasılsa doğrulanır geçti ve kötü niyetli sql içermiyor dize varsayarsak

+0

Bu, saklanan programın içinde mükemmel çalışır, teşekkürler. Bu ayrıca, bir ek bonus olan Cast Iron uygulamasından nasıl bahsedeceğim. – MMKD

+2

bu çalışır, ancak masadaki tüm satırları getirmesi gerektiğinden, her satırın setinize göre karşılaştırılması gerektiğinden çok etkili değildir, bu da eşleşip eşleşmediğini kontrol etmek için virgülle ayrılmış listeden geçmelidir. sütunların sayısı düşük, o zaman aksi takdirde bir meyilli yol bulmak gerekir – Populus

+0

@Populus yorum sökülmelidir daha fazla - FIND_IN_SET herhangi bir tablo endeksleri kullanmaz, bu yüzden eğer bu şekilde kullanılırsa büyük bir performans problemi –

1

, hazırlıklı ifadeleri kullanabilirsiniz aslında virgülle ayrılmış. Bu durumda başka herhangi bir sınırlama çalışmayacaktır.

İlgili konular