首页 > 解决方案 > 使用游标遍历列和行,将每个列和行分配给变量

问题描述

我正在尝试使用游标遍历表,该游标查看列名和该列在该行中包含的值。然后我想同时使用列名和值来分配给变量,这些变量将被传递到一个函数中,格式如下:

在我的循环中,我尝试使用 SELECT 语句将该行中该列的值分配给一个变量,但我只得到 0 回来。我还尝试了一种蛮力方法,为每个值设置一个单独的变量,但这会停止通过列名的迭代。我只做了几个星期的 MySQL,我正在慢慢到达那里,但这让我很难过。

BEGIN

DECLARE done INT DEFAULT 0;
DECLARE i INT DEFAULT FALSE;
DECLARE num_rows INT DEFAULT FALSE;
DECLARE col_name VARCHAR(2000) DEFAULT FALSE;
DECLARE info INT DEFAULT 0;


DECLARE col_names CURSOR FOR
  SELECT column_name
  FROM INFORMATION_SCHEMA.COLUMNS
  WHERE table_name = 'tbl_results';

DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;  

OPEN col_names;


the_loop: LOOP

    IF done = 1 THEN
        LEAVE the_loop;
    END IF;

    FETCH col_names INTO col_name;

    SET info = (SELECT col_name FROM tbl_results LIMIT 1);

    SELECT xml_tag(col_name,info); 

END LOOP the_loop;

CLOSE col_names;

END$$

xml_tag 只是一个完成其工作的格式化函数。例如,我的代码的输出始终是<id>0</id>. 除非我之前将信息分配给特定的东西,否则该值永远不会改变。

标签: mysql

解决方案


希望这能解决你的问题,

delimiter $$
create procedure test()
BEGIN

DECLARE done INT DEFAULT 0;
DECLARE i INT DEFAULT FALSE;
DECLARE num_rows INT DEFAULT FALSE;
DECLARE col_name VARCHAR(2000) DEFAULT FALSE;

DECLARE col_names CURSOR FOR
  SELECT column_name
  FROM INFORMATION_SCHEMA.COLUMNS
  WHERE table_name = 'tbl_results';

DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;  

set @info= null, @col_value= null;

OPEN col_names;


the_loop: LOOP

    FETCH col_names INTO col_name;
    IF done = 1 THEN
        LEAVE the_loop;
    END IF;


    SET @info = concat('SELECT ',col_name,' into @col_value FROM tbl_results LIMIT 1');
    prepare sqlstmt from @info;
    execute sqlstmt;
    deallocate prepare sqlstmt;


    SELECT xml_tag(col_name,@col_value); 

END LOOP the_loop;

CLOSE col_names;
set done = 0;

END$$

推荐阅读