DELIMITER $$
CREATE PROCEDURE List_IL()
BEGIN
DECLARE Project_Number_val VARCHAR( 255 );
DECLARE Temp_List_val VARCHAR(255);
DECLARE Project_List_val VARCHAR(255);
DECLARE FoundCount INT;
DECLARE Project_Number INT;
DECLARE db_Name VARCHAR(255);
DECLARE no_more_rows BOOLEAN;
DECLARE loop_cntr INT DEFAULT 0;
DECLARE num_rows INT DEFAULT 0;
DECLARE projects_cur CURSOR FOR
SELECT Project_Id
FROM Project_Details;
DECLARE CONTINUE HANDLER FOR NOT FOUND
SET no_more_rows = TRUE;
OPEN projects_cur;
select FOUND_ROWS() into num_rows;
the_loop: LOOP
FETCH projects_cur
INTO Project_Number_val;
IF no_more_rows THEN
CLOSE projects_cur;
LEAVE the_loop;
END IF;
SET Project_List_val = CONCAT(Project_Number_val, '_List');
SET db_Name='panel';
SELECT COUNT(1) INTO FoundCount FROM information_schema.tables WHERE table_schema = `db_Name` AND table_name = `Project_List_val`;
IF FoundCount = 1 THEN
SET @Project_Number=Project_Number_val;
SET @sql = CONCAT(' SELECT Panel_Id,', Project_Number_val,'
FROM ', @Project_List_val,' Where status=1');
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
END IF;
SET loop_cntr = loop_cntr + 1;
END LOOP the_loop;
END $$
上記のストアドプロシージャでは、準備されたステートメントの実行中に選択されたすべての行を取得するにはどうすればよいですか?ループが終了した後、ストアドプロシージャを呼び出した結果セット全体を返します。これを行う方法を教えていただけますか?
このようなログテーブルを作成するソリューションを提案します
CREATE TABLE log_records
(
Panel_Id INT,
Project_Number_val VARCHAR(255)
);
コードに次のように行を追加します。ここで、選択したlog_tableにそれらのレコードを挿入します。行を確認してください/ ** Added by abdul * /
IF FoundCount = 1 THEN
SET @Project_Number=Project_Number_val;
SET @sql = CONCAT(' SELECT Panel_Id,', Project_Number_val,' FROM ', @Project_List_val,' Where status=1');
/*--Added by Abdul*/
SET @insert_sql = CONCAT ('INSERT INTO log_records' ,'SELECT Panel_Id,', Project_Number_val,' FROM ', @Project_List_val,' Where status=1');
PREPARE stmt_insert FROM @insert_sql;
EXECUTE stmt_insert;
DEALLOCATE PREPARE stmt_insert;
/**--End**/
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
END IF;
そして、ループの終わりに行を追加します
SELECT * FROM log_records;
これにより、望ましい結果が得られます。
また、カーソルを開く前にコードに1行を記述します。そうしないと、各プロシージャコールがそのテーブルにデータを追加します。
TRUNCATE TABLE log_table;