2

クエリ結果からすべての行を取得し、それらを個別に処理する方法を見つけようと研究しています。うまくいくと思っていたスクリプトを書きましたが、どうやらそうではないようです。

スクリプト:

DECLARE @name char(20);

DECLARE c1 CURSOR READ_ONLY
FOR
SELECT table_name
FROM information_schema.tables WHERE table_schema = 'puslogger' AND UPDATE_TIME < (now() - interval 30 day)

OPEN c1; 

FETCH NEXT FROM c1
INTO @table_name

WHILE @@FETCH_STATUS = 0
BEGIN

PREPARE stmt FROM "concat('DROP TABLE IF EXISTS `', @table_name,'`;')"
EXECUTE stmt
DEALLOCTATE stmt

FETCH NEXT FROM c1
INTO @table_name

END

CLOSE c1
DEALLOCATE c1

このスクリプトは、30 日以上経過したすべてのテーブルを削除することを目的としています。MySQL バージョン 5.5.37 では動作しないようですが。

MySQL は初めてで、MySQL for Windows (XP) でサーバーを実行しています。CURSORS のこの構文は、対応するサーバーのバージョンに対して正しくないのでしょうか? よくわかりませんが、誰かが私を助けてくれたらとてもうれしいです。

編集:

これは、SQL コマンド ラインからスクリプトを実行しようとしたときに返されるエラー メッセージです。

エラー 1064 (42000): SQL 構文にエラーがあります。

1 行目の 'DECLARE @name char(20)' 付近で使用する正しい構文については、MySQL サーバーのバージョンに対応するマニュアルを確認してください。

エラー 1064 (42000): SQL 構文にエラーがあります。

MySQL サーバーのバージョンに対応するマニュアルで、1 行目の 'DECLARE c1 CURSOR READ_ONLY FOR SELECT table_name FROM information_schema.tables' 付近で使用する正しい構文を確認してください。

エラー 1064 (42000): SQL 構文にエラーがあります。near 'FETCH NEXT FROM c1 INTO @table_name を使用する正しい構文については、MySQL サーバーのバージョンに対応するマニュアルを確認してください。

WHILE @@FETCH_STATUS = 0 BEGIN

PREPARE st' at line 1

アップデート:

このスクリプトも試しました (注: 30 日以上経過したテーブルを削除するために毎日実行されるイベントを作成するつもりです)。

delimiter |

CREATE EVENT clean_logger
    ON SCHEDULE EVERY 1 DAY
    DO
    BEGIN
        DECLARE @name char(20);
    DECLARE c1 CURSOR READ_ONLY
    FOR
    SELECT table_name
    FROM information_schema.tables WHERE table_schema = 'puslogger' AND UPDATE_TIME < (now() - interval 30 day);

    OPEN c1; 

    FETCH NEXT FROM c1
    INTO @table_name;

    WHILE @@FETCH_STATUS = 0
    BEGIN

    PREPARE stmt FROM "concat('DROP TABLE IF EXISTS `', @table_name,'`;')";
    EXECUTE stmt;
    DEALLOCTATE stmt;

    FETCH NEXT FROM c1
    INTO @table_name;

    END;

CLOSE c1;
DEALLOCATE c1;
END |

delimiter ;

このスクリプトを SQL コマンド ラインで実行すると、以下が返されます。

エラー 1064 (42000): SQL 構文にエラーがあります。

'@name char(20); の近くで使用する正しい構文については、MySQL サーバーのバージョンに対応するマニュアルを確認してください。DECLARE c1 CURSOR READ_ONLY FOR SELECT table_name FROM infor' 5 行目

4

1 に答える 1