2012-12-19 18 views
6

Chcę utworzyć procedurę składowaną, która akceptuje wszystkie wartości w parametrze IN jako pojedynczy ciąg.Procedura przechowywana MySQL, która akceptuje ciąg o wielu parametrach

DELETE FROM object 
WHERE Type NOT IN 
    ('ListGrid', 
    'TextField', 
    'SpinBox', 
    'MenuButton', 
    'ListGrid', 
    'RadioButton', 
    'DropDown', 
    'PopUp', 
    'Element', 
    'Checkbox', 
    'TreeDropDown', 
    'TblColumn', 
    'Button', 
    'Link', 
    'Filter', 
    'TblRow', 
    'GridRow', 
    'Popup') 

Jest to przykład jednego próbowałem, ale to nie działa.

DELIMITER // 
CREATE PROCEDURE deleteObjectTypes(IN p_type VARCHAR(255)) 
BEGIN 
SET @query = CONCAT ('DELETE FROM object WHERE Type NOT IN (',p_type,')'); 
PREPARE stmt FROM @query; 
EXECUTE stmt; 
DEALLOCATE PREPARE stmt; 
END // 
DELIMITER ; 

pojawia się następujący błąd:

#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''List)' at line 1 

Po uruchomieniu tej kwerendy:

CALL deleteObjectTypes("'ListGrid1','TextField1','SpinBox1','MenuButton1','ListGrid2','TextField2','SpinBox2','MenuButton2','ListGrid3','TextField3','SpinBox3','MenuButton3','ListGrid4','TextField4','SpinBox4','MenuButton4','ListGrid5','TextField5','SpinBox5','MenuButton5','ListGrid6','TextField6','SpinBox6','MenuButton6'") 
+0

czy komunikat o błędzie podczas uruchamiania tego? – Malachi

+0

Po aktualizacji, patrz edycja. – Colin747

+0

Błąd nie pasuje do żadnej części dostarczonego do tej pory kodu. ale wygląda na to, że możesz mieć dodatkowe '' 'w tym miejscu. – Malachi

Odpowiedz

11

trzeba zmienić rozmiar VARCHAR na jego maksymalna wartość (lub niższego znacząca wartość) .

DELIMITER // 
CREATE PROCEDURE deleteObjectTypes(IN p_type VARCHAR(65535)) 
BEGIN 
    SET @query = CONCAT ('DELETE FROM object WHERE Type NOT IN (',p_type,')'); 
    PREPARE stmt FROM @query; 
    EXECUTE stmt; 
    DEALLOCATE PREPARE stmt; 
END // 
DELIMITER ; 

Należy jednak pamiętać, że limit jest niższy w przypadku korzystania z zestawu znaków multi-byte:

VARCHAR(21844) CHARACTER SET utf8 

Jak widać here.

+0

Nie działa po 255 znaków w jakiś sposób? – Colin747

+0

Edytowałem odpowiedź, aby radzić sobie z większymi ciągami znaków. –

+0

bardzo przydatne do wykonywania sql za pomocą łańcucha znaków, zamiast bezpośredniego zapytania. Nigdy nie wiedziałem, jak wykonać z ciąg kwerendy sql. – Lin

2

(przepraszam, nie mogę dodawać komentarzy zbyt niskiej reputacji) Twoja procedura wygląda dobrze, może problem jest gdzieś indziej? pamiętać, że mamy zdefiniowane jako varchar 255 znaków i przykład podałeś więcej niż ten numer (291 znaków)

+0

Czy jest jakiś sposób obejścia tego? – Colin747

+0

czy powoduje błąd o rozmiarze zmiennym podczas uruchamiania procedury przechowywanej? Nie sądzę, że rozmiar zmiennej jest problemem, ale mogę się mylić – Malachi

+1

Po uruchomieniu go z 255 znaków działa, gdy uruchamiam go z 256, nie działa. – Colin747

1

Należy spróbuj tego (skrócona przykład):

DELETE 
FROM 
    object 
WHERE 
    NOT FIND_IN_SET(Type, 'ListGrid,TextField,SpinBox,MenuButton,ListGrid'); 

oraz z procedury przechowywanej

DELIMITER // 
CREATE PROCEDURE deleteObjectTypes(IN p_type VARCHAR(255)) 
BEGIN 
    DELETE 
    FROM 
    object 
    WHERE 
    NOT FIND_IN_SET(Type, p_type); 
END // 
DELIMITER ; 

CALL deleteObjectTypes('ListGrid1,TextField1,SpinBox1,MenuButton1,ListGrid2,TextField2,SpinBox2,MenuButton2,ListGrid3,TextField3,SpinBox3,MenuButton3,ListGrid4,TextField4,SpinBox4,MenuButton4,ListGrid5,TextField5,SpinBox5,MenuButton5,ListGrid6,TextField6,SpinBox6,MenuButton6'); 
+0

powiedzieli, że problem znajduje się w Limit zmiennej zostanie osiągnięty – Malachi

+1

@Malachi thanx dla downvoting, ale nie dostaniesz błąd z moim rozwiązaniem, nawet z demo dane (ciąg zawiera 251 znaków). Dałem działające, proste i bezpieczne w użyciu rozwiązanie –

Powiązane problemy