mysqlの公式ドキュメントに載っているやり方のようです。
カーソルで、値をバインドしたい時には、ユーザー変数を利用するとできます。
プロシージャサンプル
----------------------------------------------------------------
drop procedure if exists sample_cursor;
DELIMITER ;;;
CREATE DEFINER=`root`@`localhost` PROCEDURE `sample_cursor` (IN schemaNm VARCHAR(100) , IN tableNm VARCHAR(100) , IN pos VARCHAR(10))
READS SQL DATA
BEGIN
DECLARE done INT DEFAULT 0;
DECLARE val VARCHAR(100);
DECLARE cur CURSOR FOR
SELECT
column_name
FROM
information_schema.columns
where
TABLE_SCHEMA = @table_schema collate utf8_unicode_ci
and TABLE_NAME = @table_name collate utf8_unicode_ci
and ORDINAL_POSITION = @ordinal_position collate utf8_unicode_ci
;
DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done = 1;
select schemaNm , tableNm , pos into @table_schema ,@table_name , @ordinal_position;
open cur;
REPEAT
FETCH cur into val;
-- データが存在する場合
IF NOT done THEN
select val;
END IF;
UNTIL done END REPEAT;
close cur;
end
;
;;;
DELIMITER ;
----------------------------------------------------------------
以下実行結果
mysql> call sample_cursor('information_schema','COLUMNS',1);
+---------------+
| val |
+---------------+
| TABLE_CATALOG |
+---------------+
1 row in set
Query OK, 0 rows affected
mysql> call sample_cursor('information_schema','COLUMNS',2);
+--------------+
| val |
+--------------+
| TABLE_SCHEMA |
+--------------+
1 row in set
Query OK, 0 rows affected
mysql> call sample_cursor('information_schema','COLUMNS',3);
+------------+
| val |
+------------+
| TABLE_NAME |
+------------+
1 row in set
Query OK, 0 rows affected
まだまだいろいろとできそうです。
0 件のコメント:
コメントを投稿