【发布时间】:2012-09-06 09:20:13
【问题描述】:
问题
我有一个存储过程:
CREATE PROCEDURE `ProblematicProcedure` (IN dbName varchar(50), IN tableId INT)
MODIFIES SQL DATA
BEGIN
DROP VIEW IF EXISTS v1;
DROP VIEW IF EXISTS v2;
CALL ExecuteSql(CONCAT("CREATE VIEW v1 AS SELECT * FROM ",dbName,".my_table;"));
CALL ExecuteSql(CONCAT("CREATE VIEW v2 AS SELECT * FROM ",dbName,".table_",tableId,";"));
...
当直接从命令行或 Navicat 或 HeidiSql 等客户端调用时,它运行良好:
CALL ProblematicProcedure("my_schema",1);
但如果使用上面完全相同的行从自定义 Apache 模块调用,它会在第一次 ExecuteSql 调用时崩溃。从 Apache 模块调用时,我必须让它工作并且找不到崩溃的原因。
ExecuteSql定义
CREATE PROCEDURE ExecuteSql (IN sql_str TEXT)
BEGIN
SET @query = sql_str;
PREPARE stm FROM @query;
EXECUTE stm;
DEALLOCATE PREPARE stm;
END
我尝试了什么?
- 交换了两个
ExecuteSql调用。 - 内联
ExecuteSql调用。 - 删除了
ExecuteSql并使用了带有硬编码dbName和tableId值的直接SQL 语句。 - 创建的过程没有
MODIFIES SQL DATA。 - 授予
CREATE VIEW特权:GRANT ALL ON *.* TO 'myuser'@'%';
注意:我在行之间添加了简单的插入语句来查找崩溃的位置。所以,我确信它总是在第一次调用 ExecuteSql 时崩溃。
问题
这次崩溃的原因是什么?
更新:终于找到错误码了:
错误 1312: 过程无法返回给定上下文中的结果集
【问题讨论】:
-
直接调用它也可以在我的机器上工作。版本为
mysql Ver 14.14 Distrib 5.1.63, for debian-linux-gnu (x86_64) using readline 6.2和mysql Ver 14.14 Distrib 5.1.47, for Win64 (unknown) -
我认为您不需要
MODIFIES SQL DATA尝试在没有它的情况下重新创建程序。见:dev.mysql.com/doc/refman/5.5/en/create-procedure.html
标签: mysql stored-procedures prepared-statement