我在使用PREPARE和EXECUTE时遇到了麻烦,因为我正在做一些有点奇怪的事情 - 执行从数据库中获取的预先准备好的SQL语句(而不是在存储过程中构建它)。
我看到问题MySQL :: Run SQL statement within Variable和这个问题My SQL Dynamic query execute and get ouput into a variable in stored procedure并且从这些问题中收集到我不能在prepare语句中使用SP DECLARED变量(MySQL WorkBench在我尝试时立即发出错误)等等必须使用带有' AT符号的变量' (不确定这意味着什么?)。所以我一直试图让以下工作:
DECLARE sqlUpdateSp TEXT;
IF (SELECT EXISTS (SELECT updateSql FROM sys_instantUpdates WHERE expiryDate >= NOW() AND securityToken = securityTokenIn AND updateType = updateTypeIn)) THEN
SELECT updateSql INTO sqlUpdateSp FROM sys_instantUpdates WHERE expiryDate >= NOW() AND securityToken = securityTokenIn AND updateType = updateTypeIn;
SET @phlanx = sqlUpdateSp;
PREPARE sqlToExecute FROM @phlanx;
EXECUTE sqlToExecute;
END IF
我没有错误,其余的SP功能正常,但这个SQL永远不会被执行,我猜测是因为' sqlToExecute'没有正确形成。
我在SP中的PREPARE / EXECUTE上可以找到的所有内容都假定正在执行的SQL是在SP中创建的,而不是从数据库中提取的。
答案 0 :(得分:0)
尝试使用stmt而不是sqlToExecute
DECLARE sqlUpdateSp TEXT;
IF (SELECT EXISTS (SELECT updateSql FROM sys_instantUpdates WHERE expiryDate >= NOW() AND securityToken = securityTokenIn AND updateType = updateTypeIn)) THEN
SELECT updateSql INTO sqlUpdateSp FROM sys_instantUpdates WHERE expiryDate >= NOW() AND securityToken = securityTokenIn AND updateType = updateTypeIn;
SET @phlanx = sqlUpdateSp;
PREPARE stmt FROM @phlanx;
EXECUTE stmt ;
END IF
答案 1 :(得分:0)
向所有人道歉 - 这似乎随机开始工作。我不确定在我的测试中,MySQL是否缓存了结果,因此更新没有显示,但是没有更正,没有更改代码。