当前位置: 首页 > 面试题库 >

MySQL存储过程接受带有多个参数的字符串

岳玉书
2023-03-14
问题内容

我想创建一个存储过程,该存储过程接受IN参数中的所有值作为单个字符串。

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

问题答案:

您需要将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


 类似资料:
  • 我正在尝试将我上传到Tomcat的文件的路径存储到我的MySQL数据库中。我已经存储了名为filepath的字符串的路径,但是当我执行程序时,我收到了以下错误: “您的SQL语法有错误;检查与您的MySQL服务器版本对应的手册,了解在第1行的':\User\Nick\Desktop\bot.png)'附近使用的正确语法”我使用的代码的一部分: 我想问题与路径的格式有关,但我对java很陌生,所以我

  • 问题内容: 我有一个来自此(google book )的mysql存储过程,一个例子是这样的: 该程序编译正常。(我在ubuntu中使用MySQL查询浏览器)。 但是,当我调用该过程时: (也在查询浏览器中) 它返回一个错误: 为什么这个例子不起作用? 问题答案: 无法复制。对我来说效果很好: 也许您应该粘贴整个错误消息,而不是对其进行汇总。

  • 问题内容: 我正在使用Sql Server2008。我的存储过程接受将近150个参数。在性能方面有什么问题吗? 问题答案: 在性能上没有错,但是闻起来可以用动态SQL更好地完成。不看代码很难说。

  • 如何从命令行调用存储过程? 我有个程序:

  • 本文向大家介绍Mysql通过存储过程分割字符串为数组,包括了Mysql通过存储过程分割字符串为数组的使用技巧和注意事项,需要的朋友参考一下 分割字符串为数组需要用到 三个mysql 的函数 : REVERSE(str) 返回颠倒字符顺序的字符串str。 SUBSTRING_INDEX(str,delim,count) 返回从字符串str的第count个出现的分隔符delim之后的子串。如果coun

  • 我想在Oracle存储过程中编写一个简单的插入语句。目标表有40列。因此,我计划在过程级别接受记录%rowtype类型的输入参数,而不是一个接一个地将所有参数传递给过程。 我的问题是, 首先可能吗 如果是,我如何从Java代码中调用这个过程并传递record类型的输入