テーブルへのカーソルを開き、すべてのレコードを反復処理するストアド プロシージャを作成しています。反復プロセスでは、最初のカーソルの結果に基づいて動的クエリを作成します。
動的 SQL でカーソルを開く必要がありますが、MySQL では許可されていません。MySQL の公式ドキュメントによると、「ハンドラーを宣言する前にカーソルを宣言する必要があります。カーソルまたはハンドラーを宣言する前に、変数と条件を宣言する必要があります」。
スクリプトは次のとおりです。
DELIMITER $$
DROP PROCEDURE IF EXISTS sp_test$$
CREATE PROCEDURE `sp_test`()
BEGIN
-- Declarations
DECLARE prepared_sql VARCHAR(1000);
DECLARE index_count INT;
-- Cursors
DECLARE cursor1 CURSOR FOR SELECT * from table1;
-- Continue Handler for Cursor
DECLARE CONTINUE HANDLER FOR NOT FOUND SET no_more_rows = TRUE;
-- Open cursors
OPEN cursor1;
-- Business Logic
all_alerts_loop: LOOP
-- Fetch record from cursor1 and create a dynamic sql
-- Check if cursor has reached to end than leave the loop
IF no_more_rows THEN
LEAVE all_alerts_loop;
END IF;
WHILE @some_other_variable <> 0
DO
-- I want to open cursor 2 on this sql
-- set @prepared_sql = 'create dynamic sql here';
END WHILE;
-- This works fine
PREPARE stmt FROM @prepared_sql;
EXECUTE stmt;
-- But can't define cursor here? so what is the solution
-- Gives syntax error, I have tried with @prepared_sql also rather than stmt
DECLARE cursor2 CURSOR FOR stmt;
END LOOP;
-- closing cursors
CLOSE cursor1;
END$$
DELIMITER ;
動的クエリのカーソルを作成する方法について何か考えはありますか? MySQLで?