ストアドファンクション⇒プロシージャ呼出し失敗する
参考の通りに、ストアドプロシージャ作成SQL文を発行し、
コマンドライン上からは、以下の通りの結果1となり、
レコードがinsertされます。
<結果1>
mysql> call logger('ほげ', 'ホゲ');
Query OK, 1 row affected (0.01 sec)
mysql> select * from PROCEDURE_LOG;
+--------+--------+---------------------+
| NAME | QUERY | EXECUTE_DATE |
+--------+--------+---------------------+
| ほげ | ホゲ | 2014-03-26 10:41:26 |
+--------+--------+---------------------+
1 row in set (0.00 sec)
ですが、testというストアドファンクションから呼び出してみましたが、
以下の結果2の通り、失敗します。
<結果2>
mysql> select test();
ERROR 1336 (0A000): Dynamic SQL is not allowed in stored function or trigger
<test>
BEGIN
CALL logger('test','1');
RETURN CONCAT('END');
END
現在動作している環境では、どこでエラーが発生したかがわからず、
ロガーの処理をなんとしても実装したいのですが、
いろいろ試してみても、解決できませんでした。
ご教示のほど、よろしくお願いします。
<参考>
http://treeapps.hatenablog.com/entry/20120106/p1
<ストアドプロシージャ作成SQL文(logger)>
SET NAMES UTF8;
delimiter //
-- ログ出力
DROP PROCEDURE IF EXISTS logger//
CREATE PROCEDURE logger(
IN PROCEDURE_NAME TEXT,
IN SQL_TEXT TEXT
)
BEGIN
DECLARE CNT INT;
CREATE TABLE IF NOT EXISTS PROCEDURE_LOG (
NAME VARCHAR(64),
QUERY TEXT,
EXECUTE_DATE TIMESTAMP,
KEY IDX1 (NAME, QUERY(64), EXECUTE_DATE)
) ENGINE=MYISAM DEFAULT CHARSET=UTF8;
-- 古いログを削除
SELECT COUNT(*) INTO CNT FROM PROCEDURE_LOG;
IF CNT >= 1000 THEN
DELETE FROM PROCEDURE_LOG LIMIT 1;
END IF;
-- テーブルにログを記録
SET @sql = CONCAT('INSERT INTO PROCEDURE_LOG VALUES (', QUOTE(PROCEDURE_NAME), ',', QUOTE(SQL_TEXT), ', null)');
PREPARE stmt FROM @sql;
EXECUTE stmt;
END
//
delimiter ;
お礼
ありがとうございました exec master..xp_cmdshell でいけるようです