MySQL存储过程,使用PREPARE / EXECUTE执行从表中获取的SQL

时间:2014-04-23 12:46:07

标签: mysql

我在使用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中创建的,而不是从数据库中提取的。

2 个答案:

答案 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是否缓存了结果,因此更新没有显示,但是没有更正,没有更改代码。