问题
我有一个存储过程:
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
调用。 - 删除's 并使用带有硬编码和值
ExecuteSql
的直接 SQL 语句。dbName
tableId
- 创建没有
MODIFIES SQL DATA
. - 授予
CREATE VIEW
特权:GRANT ALL ON *.* TO 'myuser'@'%';
注意:我在行之间添加了简单的插入语句以查找崩溃的位置。所以,我确信它总是在第一次ExecuteSql
通话时崩溃。
问题
这次崩溃的原因是什么?
更新:最后,我设法找到错误代码:
错误 1312:过程无法在给定的上下文中返回结果集