問題
ストアドプロシージャがあります:
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
2つの呼び出しを入れ替えました。- インライン
ExecuteSql
コール。 - を削除し、ハードコードされた値
ExecuteSql
を持つ直接SQLステートメントを使用しました。dbName
tableId
- なしでプロシージャを作成し
MODIFIES SQL DATA
ました。 - 付与され
CREATE VIEW
た特権:GRANT ALL ON *.* TO 'myuser'@'%';
注:クラッシュしている場所を見つけるために、行の間に単純な挿入ステートメントを追加しました。ExecuteSql
したがって、最初の呼び出しで常にクラッシュすると確信しています。
質問
このクラッシュの理由は何でしょうか?
更新:最後に、エラーコードを見つけることができました:
エラー1312:プロシージャは指定されたコンテキストで結果セットを返すことができません