准备语句将逗号分隔值传递给存储过程参数

2024-04-10

我无法将查询移动到存储过程中。我需要将逗号分隔的字符串传递给参数yr_model_no两个人IN条款。我已经阅读了一些线程并决定使用准备语句。原始查询可以很好地获取多行,但是在存储过程中,当我用call load_things('1283943kd9,2e9kk389334','53')(第一个是型号列表,第二个是用户 ID),它只能从逗号分隔字符串的第一个值中获取一行。一开始以为是长度问题yr_model_no参数,但将其更改为varchar(200)会给我未知的专栏2e9kk389334在“where 子句”错误中。有人可以帮我找出以下代码中的准备语句或参数有什么问题吗?

这是一个类似的小提琴例子 http://sqlfiddle.com/#!2/9b7d60/5我的表架构和查询。

DELIMITER ;;
CREATE PROCEDURE `load_things` (IN `yr_model_no` varchar(20), IN `yr_app_id` int(5))
BEGIN
    SET @s = 

CONCAT('
SELECT * FROM 
(
   SELECT COUNT( c.app_id ) AS users_no, ROUND( AVG( c.min ) , 1 ) AS avg_min, ROUND( AVG( c.max ) , 1 ) AS avg_max, a.mid, a.likes, a.dislikes, b.model_no
        FROM  `like` a
        RIGHT JOIN  `model` b ON a.mid = b.mid
        LEFT JOIN  `details` c ON c.mid = b.mid
        WHERE b.model_no IN (',yr_model_no,')
        GROUP BY b.model_no
)TAB1
JOIN
(
   SELECT a.app_id,b.model_no,IFNULL(c.isbooked,0) AS isbooked,d.min,d.max,e.like_type
     FROM `users` a
     JOIN `model` b
       ON b.model_no IN (',yr_model_no,')
LEFT JOIN `favorite` c 
       ON c.app_id = a.id
      AND c.mid = b.mid         
LEFT JOIN `details` d 
       ON d.app_id = a.id
      AND d.mid = b.mid 
LEFT JOIN `users_likes` e
       ON e.app_id = a.id
      AND e.mid = b.mid
    WHERE a.id = ',yr_app_id,'
)TAB2
ON TAB1.model_no = TAB2.model_no');

PREPARE stmt from @s;
EXECUTE stmt;
DEALLOCATE PREPARE stmt3;
END;;
DELIMITER ;

如果您考虑语句生成的 SQL,它将如下所示

JOIN `model` b
ON b.model_no IN (1283943kd9,2e9kk389334)

这是无效的 SQL(您需要将 varchar 值括起来)

您需要确保在传递给过程的字符串中的每个值周围添加引号:

load_things('''1283943kd9'',''2e9kk389334''','53')

不确定这是否是 MySQL 中转义字符串的正确方法(您可能需要查看文档)

这将导致:

JOIN `model` b
ON b.model_no IN ('1283943kd9','2e9kk389334')
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

准备语句将逗号分隔值传递给存储过程参数 的相关文章

  • 如何将 PHP 数组中的值插入到 MySQL 表中?

    我正在创建一个注册表单 其中包含姓名 电子邮件和电话号码字段 为了检查用户输入的有效性 我有一个函数validate input 返回一个数组 arr包含用户输入的输入 如果用户输入有效 arr然后传递给一个单独的函数 该函数将值插入arr
  • 不使用 Django 的 Python 数据库(适用于 Heroku)

    令我惊讶的是 我没有发现其他地方提出过这个问题 简而言之 我正在编写一个应用程序 计划部署到云 可能使用 Heroku 它将执行各种网络抓取和数据收集 它将位于云中的原因是 我可以将其设置为每天自行运行 并将数据提取到数据库 而无需我的计算
  • 使用 C# 恢复数据库

    我正在尝试使用 Microsoft SqlServer Management Smo 将数据库从一台服务器恢复到另一台服务器 问题是我不断收到错误消息 指出找不到 MDF 文件 原因是它试图在 SQL 实例名称的数据文件夹中查找它的来源 而
  • 如何在 PL/SQL 中查找字符串中不同字符的数量和名称[重复]

    这个问题在这里已经有答案了 我对 PL SQL 很陌生 我需要获取字符串中不同字符的名称和计数 例如 如果我有一个字符串str helloexample 我需要获得不同字符的输出str i e heloxamp 我怎样才能做到这一点 您可以
  • 如何在 MongoDB 中获取连接的客户端

    我正在编写一个使用 mongo 作为数据库的应用程序 我想打印连接到数据库的客户端 例如打印他们的ip 我怎样才能得到这些信息 我尝试使用 db serverStatus connections 但它给了我可以访问我的数据库的计算机数量 您
  • 分配给 SQLite 内存数据库的内存大小

    如果使用下面的语法创建一个内存中的sqlite数据库 那么分配给它的最大内存大小是多少 my dbh DBI gt connect dbi SQLite dbname memory 如果内存数据库的大小大于最大可用内存 将会发生什么情况 假
  • Django:ImageField 需要文件路径还是实际的图像对象?

    Running Windows 7 Python 3 3 Django 1 6 我对如何将图像存储为 Django 数据库中表的一部分感到困惑 有一个领域叫做ImageField 这是Docs https docs djangoprojec
  • 如何在SQL中编写连接查询[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 问题 给定 Employee 和 AnnualReviews 表 编写一个查询以返回所有从未接受过按 HireDate 排序的评论的员
  • 如何列出允许登录mysql的ip?

    我知道使用下面的命令 可以允许远程IP登录MySQL GRANT select insert update delete ON TO root my ip IDENTIFIED BY my password FLUSH PRIVILEGES
  • 在没有数据库的情况下运行 WordPress

    我一直在寻找一种将 WordPress 配置为仅使用文件系统数据库运行的方法 有点像 Java 中或内存中的 H2 任何人 仅用于演示目的 不可能 Wordpress 的要求之一是 MySQL http wordpress org abou
  • Laravel 5:如何检索并显示属于特定类别的所有帖子

    我有3张桌子 user id username subreddits id name created at posts id title link user id subreddit id 问题是 我手动获取 subreddit 类别的 i
  • 将数据库表转换为 XML 模式文件

    我正在使用 SQL Server 2005 是否有任何命令或 GUI 工具 例如 SQL Server Management Studio 中的任何菜单 功能 可以将数据库表转换为 XML 架构文件 xsd 提前致谢 乔治 我找到了这个 试
  • Laravel - LIKE 运算符来搜索加密值

    我正在尝试在 Laravel 应用程序中实现一个搜索模块 可以按名称过滤用户 为了保护用户 name 列行在数据库上加密 我面临的问题是下面的查询总是返回 0 结果 我在搜索数据库之前对搜索输入值进行加密 patients DB selec
  • 为什么我的 php 代码无法连接到远程 MySql 数据库?

    我正在尝试连接到远程 MySql 数据库 但收到以下错误消息 警告 mysqli connect HY000 2002 连接尝试失败 因为连接方在一段时间后没有正确响应 或者由于连接的主机未能响应而建立的连接失败 在 C myLocalDi
  • MySQL中的字符串分割函数

    谁能告诉我如何在 mysql 中实现 split 函数 其行为类似于 Javascript split 我想要一个这样的功能 SELECT Split a b c d AS splitted 结果如下 splitted a b c d 有谁
  • MySql - 自动完成

    我正在创建一个 Ajax 自动完成应用程序 并且想知道是否有一个 SQL 查询可以用于此目的 例如 如果有人键入 p 我想检索所有以 p 开头的单词 如果他们添加 e 检索所有以 pe 开头的单词 并继续这样 有人提出了下面的查询 但我认为
  • 如何在 PostgreSQL 中生成月份列表?

    我有一张桌子A with startdate列是TIMESTAMP WITHOUT TIME ZONE我需要编写一个查询 函数来生成月份列表MIN列的值直到MAX列的值 例如 startdate 2014 12 08 2015 06 16
  • url文本压缩(不是缩短)并存储在mysql中

    我在 mysql 中有一个 url 表 其中只有两个字段 id 和 varchar 255 用于 url 目前那里有超过 5000 万个 url 我的老板刚刚向我提供了有关当前项目扩展的线索 这将导致在该 url 表中添加更多的 url 预
  • 如何获取数字列的确切类型,包括。规模和精度?

    有没有办法知道列中列的确切类型DataTable 现在我正在这样做 DataTable st dataReader GetSchemaTable foreach DataColumn col in st Columns var type c
  • 当我将 xx 添加到 mysql float 列时,结果错误,这是一个错误吗?

    我的mysql 5 6 16 我的餐桌信息 CREATE TABLE xxx uid int 11 NOT NULL money float 10 2 NOT NULL DEFAULT 0 00 real money float 10 2

随机推荐