【问题标题】:How to simulate a print in a MySQL Stored Procedure如何在 MySQL 存储过程中模拟打印
【发布时间】:2009-03-09 17:35:59
【问题描述】:

我有一个带有几个游标的 MySQL 存储过程。我想打印一个值以将输出发送回客户端。 SQLyog Enterprise.

我尝试将变量声明为 TEXT 并在循环内连接,但这不起作用,至少不是我尝试这样做的方式。

DECLARE _output TEXT;
DECLARE _ID INT DEFAULT 0;
DECLARE cur1 CURSOR FOR SELECT ID FROM CodeID;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;

OPEN cur1;

REPEAT
  FETCH cur1 INTO _ID;
  IF NOT done THEN
    SET _output = _ID; /*SEE ALT BELOW*/

  END IF;
UNTIL done END REPEAT;
CLOSE cur1;

SELECT _output;

我试过了:

SET _output = _output + _ID

SET _output = CONCAT(_output,_ID)

但它们都只返回 NULL

SET _output = _ID; 只是给了我最后获取的行。这很有帮助,但不完全是我想要的。

让每个提取的行输出到屏幕以在 MySQL 存储过程中重现 MySQL 打印的最佳方法是什么?

【问题讨论】:

    标签: stored-procedures mysql


    【解决方案1】:

    您的 SELECT _output 做得正确;任何不带 INTO 子句的选择都将返回给客户端。

    要获得所有这些,您可以将 SELECT 移到循环中(单独打印每个),或者将它们连接在一起。你的 concat 返回 NULL 的问题是因为你没有将 _output 初始化为任何东西,所以它是 NULL。用 NULL 连接任何东西都会返回 NULL。

    尝试以下方法:

    DECLARE _output TEXT DEFAULT '';
    DECLARE _ID INT DEFAULT 0;
    DECLARE cur1 CURSOR FOR SELECT ID FROM CodeID;
    DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;
    
    打开cur1;
    
    重复
      FETCH cur1 INTO _ID;
      如果没有完成 那么
        SET _output = CONCAT(",", _ID); /*见下面的替代*/
    
      万一;
    直到完成 END REPEAT;
    关闭cur1;
    
    选择_输出;
    

    【讨论】:

    • 不应该是SET _output = CONCAT(_output, ",", _ID);否则只有最后一个ID
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-12-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多