MySQLマニュアル から
ただし、2つの方法があります。
1つ目は、一度に1人のユーザーのみがプロシージャを実行する場合です。プリペアドステートメントを使用して動的SQLでビューを作成でき、カーソルはこの静的な名前のビューから選択できます。パフォーマンスへの影響はほとんどありません。残念ながら、これらのビューは他のユーザーにも表示されるため(一時的なビューなどはありません)、これは複数のユーザーには機能しません。
同様に、一時テーブルはprepareステートメントで作成でき、カーソルは一時テーブルから選択できます。現在のセッションのみが一時テーブルを表示できるため、複数ユーザーの問題が解決されます。ただし、procを実行するたびに一時テーブルを作成する必要があるため、このソリューションはパフォーマンスに大きな影響を与える可能性があります。
結論:動的に作成できるようにするには、カーソルが必要です。
ビューを使用して、テーブル名と列名をmysqlフォーラム
DELIMITER //
DROP PROCEDURE IF EXISTS test_prepare//
CREATE PROCEDURE test_prepare(IN tablename varchar(255), columnname varchar(50))
BEGIN
DECLARE cursor_end CONDITION FOR SQLSTATE '02000';
DECLARE v_column_val VARCHAR(50);
DECLARE done INT DEFAULT 0;
DECLARE cur_table CURSOR FOR SELECT * FROM test_prepare_vw;
DECLARE CONTINUE HANDLER FOR cursor_end SET done = 1;
SET @query = CONCAT('CREATE VIEW test_prepare_vw as select ', columnname, ' from ', tablename);
select @query;
PREPARE stmt from @query;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
OPEN cur_table;
FETCH cur_table INTO v_column_val;
WHILE done = 0 DO
SELECT v_column_val;
FETCH cur_table INTO v_column_val;
END WHILE;
CLOSE cur_table;
DROP VIEW test_prepare_vw;
END;
//
DELIMITER ;