2014年7月3日木曜日

MySQLで、カーソルを使って変数バインドでデータを返す

mysqlでカーソルを使ってあれこれやろうとした時に作ったサンプルを置いておきます。

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 件のコメント: