データベース名を引数として取り、そのデータベース内で MULTI DELETE を発行する MySQL 5.1 用のプロシージャを作成しようとしています。回避方法がわからない 2 つの問題が発生しています。
USE
準備済みステートメントでは使用できません。試してみると、「このコマンドは、準備済みステートメント プロトコルではまだサポートされていません」というメッセージが表示されます。- MULTI DELETE では、別のデータベースのテーブルを削除できません。試してみると、「MULTI DELETE の不明なテーブル 'x'」と表示されます。
コードサンプルは次のとおりです。
DELIMITER $$
CREATE PROCEDURE multi_test (
IN dbname VARCHAR(20)
)
BEGIN
SET @us = CONCAT('USE ', dbname, ';');
PREPARE ustmt FROM @us;
EXECUTE ustmt;
DEALLOCATE PREPARE ustmt;
SET @s = CONCAT('DELETE t FROM ', dbname, '.t as t INNER JOIN ', dbname, '.t2 as t2 IN t.f_id = t2.id');
PREPARE stmt FROM @s;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
END $$
DELIMITER ;
この場合も、「このコマンドは準備済みステートメント プロトコルではまだサポートされていません」という結果になります。
もう 1 つの目的は、これを MySQL に保持することです。MySQL に接続するスクリプト言語を使用するのではなく、クライアント CLI から呼び出すことができる MySQL プロシージャをいくつか用意するだけです。ただし、MySQL で可能であれば、(PostgreSQL でできるように) 他の言語でプロシージャを使用することに反対はしません。