mysql - 使用游标遍历列和行,将每个列和行分配给变量
问题描述
我正在尝试使用游标遍历表,该游标查看列名和该列在该行中包含的值。然后我想同时使用列名和值来分配给变量,这些变量将被传递到一个函数中,格式如下:
在我的循环中,我尝试使用 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>
. 除非我之前将信息分配给特定的东西,否则该值永远不会改变。
解决方案
希望这能解决你的问题,
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$$
推荐阅读
- python - Raspberry Pi 上的数码相框程序内存不足问题(B 型,修订版 2.0)
- typescript - 如何更新我的 heroku 服务器上的 typescript 编译器?
- android - 使用滚动视图时,Android 和 iOS 上的滑动手势之间的行为差异
- visual-studio - 如何快速修复 .net 核心解决方案中的所有 Nuget 引用?
- oracle - 在 Oracle 中使用 OR 运算符执行具有多个子查询的外部查询
- php - “将变量添加到 mysqli”
- c# - 表未显示输出
- ruby-on-rails - f.select 的自定义字段 - 允许用户输入
- java - 如何使用来自 java 代码的输入并将其传输到外部应用程序(以及检索输出)?
- java - 无法使用 java 生成 AAD 令牌