2012-09-17 10 views
5

Mam nadzieję, że komuś uda się pomóc. Stworzyłem mój pierwszy zapisany procdure (nic nadzwyczajnego), jednak jestem uruchomiony problem.MYSQL - procedura przechowywana z wykorzystaniem oddzielonych przecinkami ciągów jako zmiennych wejściowych

chcę dać mu wejście ciąg takie jak 1,2,3,4,5 to robi prosty SELECT * FROM [TABLE] WHERE EAN IN (VAR);

Więc przechowywane proc wygląda następująco:

-- -------------------------------------------------------------------------------- 
-- 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 starając się go wykonać takie jak:

Works

call moments.new_procedure('5045318357397') 

nie działa

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

Ten który zaciągnął ale nie doesnt przynieść żadnych rezultatów. Czy classing drugie oświadczenie jako ciąg, więc jej w ten sposób:

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

a nie to:

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

Jak mogę sformatować wejście w zapytaniu wykonać, aby ją wziąć ciąg znaków rozdzielany przecinkami jako dane wejściowe?

Odpowiedz

12

Można użyć:

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

To powinno działać zakładając, że jest właściwie rozdzielane przecinkami. Wszelkie inne ograniczenia nie będą działać w tym przypadku.

+0

Działa to doskonale w przechowywanym procesie, dzięki. Tak też będę nazywał to z aplikacji Żelaznej, która jest dodatkowym bonusem. – MMKD

+2

to działa, ale nie jest zbyt wydajne, ponieważ pobiera wszystkie wiersze ze stołu, a następnie porównuje każdy wiersz z zestawem, który z kolei musi również przejrzeć listę rozdzielaną przecinkami, aby sprawdzić, czy pasuje ... Jeśli Liczba kolumn jest niska, to w porządku, inaczej powinieneś znaleźć sposób na cieście – Populus

+0

Komentarz @Populus musi zostać usunięty bardziej - FIND_IN_SET nie używa żadnych indeksów tabel, więc jest potencjalnie dużym problemem wydajności, jeśli jest używany w ten sposób –

1

Przyjmując ciąg przekazany zostaje zatwierdzone w jakiś sposób i nie zawiera szkodliwego SQL, można użyć przygotowanych sprawozdań:

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