【问题标题】:How to include conditional logic in a prepared statement in a Stored Procedure如何在存储过程的准备好的语句中包含条件逻辑
【发布时间】:2021-07-27 23:13:53
【问题描述】:

我们有一个 MySql 存储过程,其中包括以下内容:

 SET @queryString = (SELECT CONCAT("UPDATE Table2 t ",
 "JOIN vTable1 v ",
"ON t.id.=v.id ",
 "SET t.sub_id_track = 1, t.prefix = '", newPrefix,"',",
 " t.sub_id = ", vIndex,
 ";"));
 
 PREPARE update_sql FROM @queryString;

 EXECUTE update_sql;

这很好用。

我们现在需要改变它,以便

如果newPrefix 包含任何值,则

SET t.sub_id_track = 1

但如果 newPrefix 为 null 或为空,则

SET t.sub_id_track = 0

这样做的正确方法是什么?

谢谢

【问题讨论】:

  • 为什么这是一个准备好的查询,因为除了值之外没有动态部分?您可以只在未准备的 UPDATE 语句中使用局部变量。另外你为什么在同一个更新中SET t.sub_id 两次?您确定您的转录正确吗?
  • 另外,当您将newPrefix 复制到查询字符串中时,您会遇到 SQL 注入漏洞。不知道你为什么不使用查询参数来保护它。
  • 是的,抄写有误,已更正问题,谢谢指出
  • 看起来还是不对。 ON tid.=v.id 应该是 ON t.id=v.id 吗?
  • 是的,已更正,谢谢

标签: mysql sql stored-procedures


【解决方案1】:

首先,我有几个cmets:

  • 您准备好的查询存在 SQL 注入漏洞。
  • 您没有理由一开始就需要将此作为准备好的查询运行。

我建议这个替代方案:

UPDATE Table2 t
JOIN vTable1 v ON t.id = v.id
SET t.sub_id_track = IFNULL(NULLIF(newPrefix, ''), 1, 0), 
    t.prefix = newPrefix, 
    t.sub_id = vIndex;

无需准备/执行。没有 SQL 注入漏洞。它处理您描述的条件。

但我想知道您是否打算在其中包含 WHERE 子句?这会将 UPDATE 应用于每一行。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-09-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-09
    相关资源
    最近更新 更多