私はこのように定義された手順を持っています:
drop procedure if exists drop_tables_like;
delimiter $$
create procedure drop_tables_like(myint int, pattern varchar(255), db varchar(255) )
begin
DECLARE CONTINUE HANDLER FOR 1064
select now() - interval myint day into @owa;
set group_concat_max_len = 65535;
select concat('drop table ', group_concat(table_name)) into @str_sql
from information_schema.tables
where
table_schema=db and table_name like pattern and
create_time <= @owa;
prepare stmt from @str_sql;
execute stmt;
drop prepare stmt;
end$$
アイデアは、create_time <=指定された日付を持つ特定のパターンに一致するテーブルを削除することです。
実行すると、エラーが発生します。
mysql> call drop_tables_like(7, 'monkey%', 'daweb2012_civicrm');
ERROR 1243 (HY000): Unknown prepared statement handler (stmt) given to EXECUTE
mysql>
準備されたステートメントを使用しているプロシージャで例外のハンドラを宣言するにはどうすればよいですか?
これは、1064および1065エラーがキャッチされた更新済みプロシージャのサンプルです。
エラーのより長いリストについては https://Gist.github.com/onare/c8d3042ba4d18408aeee を参照してください
drop procedure if exists drop_tables_like;
delimiter $$
create procedure drop_tables_like(myint int, pattern varchar(255), db varchar(255) )
begin
DECLARE E INT DEFAULT 0;
DECLARE M TEXT DEFAULT NULL;
DECLARE CONTINUE HANDLER FOR 1064 SET E='1064', M="%s near '%s' at line %d";
DECLARE CONTINUE HANDLER FOR 1065 SET E='1065', M="Query was empty";
select now() - interval myint day into @owa;
set group_concat_max_len = 65535;
select concat('drop table ', group_concat(table_name)) into @str_sql
from information_schema.tables
where
table_schema=db and table_name like pattern and
create_time <= @owa;
prepare stmt from @str_sql;
IF E> 0 THEN
SELECT CONCAT("MySQL Error #", E, ": ", M);;
set E=0;
else
execute stmt;
drop prepare stmt;
end if;
end$$