如何在存储过程的准备语句中包含条件逻辑
How to include conditional logic in a prepared statement in a Stored Procedure
我们有一个 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
正确的做法是什么?
谢谢
首先,我有几点意见:
- 您准备的查询存在 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;
不需要 PREPARE/EXECUTE。没有 SQL 注入漏洞。它会处理您描述的条件。
但我想知道您是否打算在其中添加一个 WHERE
子句?这会将 UPDATE 应用到每一行。
我们有一个 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
正确的做法是什么?
谢谢
首先,我有几点意见:
- 您准备的查询存在 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;
不需要 PREPARE/EXECUTE。没有 SQL 注入漏洞。它会处理您描述的条件。
但我想知道您是否打算在其中添加一个 WHERE
子句?这会将 UPDATE 应用到每一行。