【问题标题】:Loop & increment values on both sides of an expression在表达式的两侧循环和递增值
【发布时间】:2015-06-11 14:20:25
【问题描述】:

我的目标是使用 LOOP 命令创建一系列“SET”命令:

SET @value_title_1 = value_1
SET @value_title_2 = value_2
...
SET @value_title_99 = value_99

编号(计数器)需要在 SET 命令的两侧增加等量的 1。

以下是我正在使用的代码的表示,还包括“虚拟条目”(您将通过等式左侧的 SET concat 识别这一点,这是棘手的部分)

delimiter $$ 
 CREATE PROCEDURE set_values_table()
 DETERMINISTIC
 BEGIN
 DECLARE counter INT DEFAULT 1;

simple_loop: LOOP
    SET counter=counter+1;
    SET concat('@value_title_',counter) = concat('value_',counter);
IF counter = 99 THEN
 LEAVE simple_loop;
 END IF;
 END LOOP simple_loop;
 SELECT "procedure completed!";
 END$$

 delimiter ;

call set_values_table();

不幸的是,SET concat(...) 会产生语法错误。任何接近解决方案的方向或步骤将不胜感激!或者还有其他方法可以达到上述相同的结果吗?

【问题讨论】:

  • 嗨,斯坦,您的问题有点不清楚。你想建立一个包含所有SET 语句的字符串吗?我不认为您可以使用字符串代替变量标识符以您想要的方式使用 SQL。
  • 我很确定你想做的事(你想做的事)是不可能的,不幸的是。
  • 嗨@TZHX - 下面的Ravinder 非常接近,但是,输出仅作为非可执行字符串中继。我需要每个创建的语句真正“设置”给定的值,这样我就可以在使用 SELECT 命令之后分别检索每个语句。
  • Stan:也许如果你建立在 Ravinder 的脚本上(这与我认为可以做的一样)并查看question and answer here 关于在过程中运行动态 sql 语句,你能用它做点什么吗?恐怕我不是 mysql 的普通用户,所以我不确定他们是否会在以这种方式执行后留在范围内。 HTH。
  • 确实! TZHX 我能够结合你的建议。而且......我得到了它的工作!我将继续标记@Ravinder 接受的答案,并向您表示敬意,因为您将我引导到最后一个缺失的部分!干杯!

标签: mysql loops variables set increment


【解决方案1】:

SET 命令只能用于为变量设置值,使用它们的名字,而不是表达式

如果我理解正确,您必须尝试生成 99 SET 命令来设置 99 变量的值并在代码中使用相同的输出。

您需要将 SP 身体部分的一部分更改如下(我使用循环计数为 5):

BEGIN
  DECLARE counter INT DEFAULT 1;
  set @result := '';

  simple_loop: LOOP
    -- SET concat('@value_title_',counter) = concat('value_',counter);
    set @result := concat( @result, '\nset @value_title_', counter );
    set @result := concat( @result, ' := value_', counter, ';' );
    IF counter = 5 THEN
      LEAVE simple_loop;
    END IF;
    SET counter=counter+1;
  END LOOP simple_loop;
  -- SELECT 'procedure completed!';
  SELECT @result as result;
END;

您可以检查输出如下:

mysql> select @result as res\G
*************************** 1. row ***************************
res:
set @value_title_1 := value_1;
set @value_title_2 := value_2;
set @value_title_3 := value_3;
set @value_title_4 := value_4;
set @value_title_5 := value_5;

您可以根据需要使用@result 变量值。

【讨论】:

  • 非常感谢@Ravinder!但是,我的意图是让这些 SET 命令真正“执行”并真正“设置”给定的值。换句话说,我应该在之后就可以运行SELECT命令,比如mysql> select @value_title_1;但这给了我 NULL 作为返回,而不是它刚刚分配的实际值(“value_1”)。这有可能以某种方式实现吗?
猜你喜欢
  • 2021-06-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-17
  • 2015-10-26
  • 1970-01-01
  • 2018-10-08
相关资源
最近更新 更多