2012-12-19 24 views
6

我想創建一個存儲過程,它將IN參數中的所有值作爲單個字符串接受。接受具有多個參數的字符串的MySQL存儲過程

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

這是我試過的一個例子,但它不起作用。

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 ; 

我收到以下錯誤:

#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 

當運行這個查詢:

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

做,當你運行這個你收到一個錯誤? – Malachi

+0

發佈更新,請參閱編輯。 – Colin747

+0

該錯誤與您目前提供的代碼的任何部分都不匹配。但它看起來像你可能有一個額外的'''在那裏 – Malachi

回答

11

您需要更改VARCHAR的大小到它的最大值(或更低顯著值) 。

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 ; 

但是,請注意限制較低,如果您使用的是多字節字符集:

VARCHAR(21844) CHARACTER SET utf8 

可以看出here

+0

它不工作後有255個字符是否有辦法解決這個問題? – Colin747

+0

我編輯了答案以處理較大的字符串。 –

+0

對於通過字符串執行sql非常有用,而不是直接查詢。我從來不知道如何執行字符串的SQL查詢。 – Lin

2

(對不起,我不能添加評論太低的聲譽) 你的程序看起來不錯,也許問題是在別的地方?注意,我們已經定義爲VARCHAR 255個字符,您所提供的例子不止這個數(291個字符)

+0

有沒有辦法解決這個問題? – Colin747

+0

當您運行存儲過程時它會給您提供有關變量大小的錯誤嗎?我不認爲可變大小是問題,但我可能是錯的 – Malachi

+1

當我用255個字符運行它時,它工作,當我運行它與256它不。 – Colin747

1

你應該試試這個(簡稱爲例):

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

,並與存儲過程

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

他們說,問題存在於變量限制達到 – Malachi

+1

@馬拉奇thanx downvoting,但你不會得到我的解決方案,即使與演示錯誤數據(該字符串包含251個字符)。我給了一個簡單的工作方法和'注射安全'的解決方案 –

相關問題