カーソルの宣言でクエリするデータベースを示すために変数を使用する必要があります。コードの短いスニペットは次のとおりです。
CREATE PROCEDURE `update_cdrs_lnp_data`(IN dbName VARCHAR(25), OUT returnCode SMALLINT)
cdr_records:BEGIN
DECLARE cdr_record_cursor CURSOR FOR
SELECT cdrs_id, called, calling FROM dbName.cdrs WHERE lrn_checked = 'N';
# Setup logging
DECLARE EXIT HANDLER FOR SQLEXCEPTION
BEGIN
#call log_debug('Got exception in update_cdrs_lnp_data');
SET returnCode = -1;
END;
ご覧のとおり、私は変数dbNameを使用して、クエリがどのデータベース内で発生するかを示しようとしています。ただし、MySQLはそれを許可しません。私も次のようなことを試しました:
CREATE PROCEDURE `update_cdrs_lnp_data`(IN dbName VARCHAR(25), OUT returnCode SMALLINT)
cdr_records:BEGIN
DECLARE cdr_record_cursor CURSOR FOR
SET @query = CONCAT("SELECT cdrs_id, called, calling FROM " ,dbName, ".cdrs WHERE lrn_checked = 'N' ");
PREPARE STMT FROM @query;
EXECUTE STMT;
# Setup logging
DECLARE EXIT HANDLER FOR SQLEXCEPTION
BEGIN
#call log_debug('Got exception in update_cdrs_lnp_data');
SET returnCode = -1;
END;
もちろん、MySQLはカーソル宣言で標準のSQLステートメントしか許可しないため、これも機能しません。
影響を受けるデータベースの名前を渡すことで、複数のデータベースで同じストアドプロシージャを使用する方法を考えられる人はいますか?