【问题标题】:MySQL procedure: error in fetchMySQL过程:获取错误
【发布时间】:2018-02-13 18:45:24
【问题描述】:

我遇到了这个问题。我正在使用 MySQL 5.7.10

我已经定义了这个 PL(我知道,TRAZAS 表中的调试消息有点杂乱无章):

DROP procedure IF EXISTS my_proc;
DELIMITER $
CREATE PROCEDURE my_proc(... , OUT resultado INT, OUT mensaje TEXT)
MODIFIES SQL DATA
BEGIN

    DECLARE sqlstate_code VARCHAR(10);
    DECLARE message_text TEXT;
    DECLARE mysql_errno INT;

    DECLARE v_id_cliente VARCHAR(100) DEFAULT '';
    DECLARE v_device VARCHAR(100) DEFAULT '';
    DECLARE v_fecha_solicitud_crm DATETIME;
    DECLARE v_id_ciclo VARCHAR(50);
    DECLARE v_fecha_alta DATETIME;
    DECLARE v_fecha_baja DATETIME;
    DECLARE v_fecha_alta_promocion DATETIME;


    DECLARE done INT DEFAULT FALSE;


    DECLARE my_cursor CURSOR FOR
    select id_cliente, device, fecha_solicitud_crm, id_ciclo,
        min(FECHAS.fecha_inicio) AS FECHA_INICIO, max(FECHAS.fecha_fin) AS FECHA_FIN
    from xxx
    where 
        xxx
    GROUP BY xxx
    ORDER BY xxx;


    DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;

    DECLARE EXIT HANDLER FOR SQLEXCEPTION
        BEGIN
        ROLLBACK;
        SET resultado = 1;

        START TRANSACTION;      
        INSERT INTO TRAZAS(TEXTO) VALUES (concat_ws(' - ', 'ERROR my_proc'));
        COMMIT;

        get diagnostics condition 1 message_text = MESSAGE_TEXT, sqlstate_code = RETURNED_SQLSTATE, mysql_errno = MYSQL_ERRNO;
        SET mensaje = concat_ws(' - ', sqlstate_code, mysql_errno, message_text);

        START TRANSACTION;      
        INSERT INTO TRAZAS(TEXTO) VALUES (concat_ws(' - ', 'ERROR my_proc', mensaje));
        COMMIT;

    END;

    SET resultado = 0;
    SET mensaje = '';




    OPEN my_cursor;

    /* Inicio del bucle */
    read_loop: LOOP

        START TRANSACTION;
        INSERT INTO TRAZAS(TEXTO) VALUES ('Inicio del loop. Antes del fetch');
        COMMIT;


        FETCH my_cursor INTO v_id_cliente, v_device, v_fecha_solicitud_crm, v_id_ciclo, v_fecha_alta, v_fecha_baja;
        IF done THEN
          LEAVE read_loop;
        END IF;


        START TRANSACTION;
        INSERT INTO TRAZAS(TEXTO) VALUES ('Despues del fetch');
        COMMIT;


        /*****/
        START TRANSACTION;
        INSERT INTO TRAZAS(TEXTO) VALUES (concat_ws(' - ', 'my_proc', 'v_id_cliente', v_id_cliente));
        INSERT INTO TRAZAS(TEXTO) VALUES (concat_ws(' - ', 'my_proc', 'v_device', v_device));
        INSERT INTO TRAZAS(TEXTO) VALUES (concat_ws(' - ', 'my_proc', 'v_fecha_solicitud_crm', v_fecha_solicitud_crm));
        INSERT INTO TRAZAS(TEXTO) VALUES (concat_ws(' - ', 'my_proc', 'v_fecha_alta', v_fecha_alta));
        INSERT INTO TRAZAS(TEXTO) VALUES (concat_ws(' - ', 'my_proc', 'v_fecha_baja', v_fecha_baja));
        COMMIT;
        /*****/


        /*
        Stuff with fetched data
        */


        START TRANSACTION;
        INSERT INTO TRAZAS(TEXTO) VALUES ('Siguiente iteracion del loop');
        COMMIT;


    /* Fin del bucle */
    END LOOP read_loop;

    CLOSE my_cursor;

END$
DELIMITER ;

我确定游标选择获取 6 行。我在 HeidiSQL 中使用相同的 PL 输入数据运行该查询,它获取 6 行。

另外,我确信这 6 行中的任何字段都为空或空白。所有数据都已完成。

不幸的是,游标只返回 1 行。 当前行为是:

  • 获取并处理第一行。东西做对了。
  • 第二行仅显示 'Inicio del 循环。 Antes del fetch 的消息。第二条消息(“Despues del fetch”)未显示。

  • 当使用 select @resultado, @mensaje 检索结果和退出消息时,它显示 0 和空白。

所以,本机 FETCH 语句中似乎存在错误,但我无法通过“获取诊断”获得有关错误的任何信息,HeidiSQL 没有显示任何内容...

我被困在这一点上。非常感谢任何帮助。

UPDATE 1:以下是 HeidiSQL 中游标查询检索到的实际数据:

INSERT INTO `myTable` (`id_cliente`, `device`, `fecha_solicitud_crm`, `id_ciclo`, `FECHA_INICIO`, `FECHA_FIN`) VALUES ('cod1-6a00-43b6-86ad-1234567e551', '60601234567533098', '2017-08-17', 'C14', '2017-07-02 05:00:22', '2017-07-21 05:55:03');
INSERT INTO `myTable` (`id_cliente`, `device`, `fecha_solicitud_crm`, `id_ciclo`, `FECHA_INICIO`, `FECHA_FIN`) VALUES ('cod2-25d3-4282-a471-12345672806', '60601234567516069', '2017-08-17', 'C14', '2017-02-19 07:03:47', '2017-07-19 07:55:02');
INSERT INTO `myTable` (`id_cliente`, `device`, `fecha_solicitud_crm`, `id_ciclo`, `FECHA_INICIO`, `FECHA_FIN`) VALUES ('cod3-c07d-42cd-9b23-12345671c2e', '60601234567605474', '2017-08-17', 'C14', '2017-06-29 05:40:17', '2017-07-27 05:05:02');
INSERT INTO `myTable` (`id_cliente`, `device`, `fecha_solicitud_crm`, `id_ciclo`, `FECHA_INICIO`, `FECHA_FIN`) VALUES ('cod4-aafe-4442-a429-12345679312', '60601234567543931', '2017-08-17', 'C14', '2017-06-24 05:22:24', '2017-07-19 07:55:02');
INSERT INTO `myTable` (`id_cliente`, `device`, `fecha_solicitud_crm`, `id_ciclo`, `FECHA_INICIO`, `FECHA_FIN`) VALUES ('cod5-0408-4656-84de-12345676ea5', '60601234567537024', '2017-08-17', 'C14', '2017-04-04 08:17:27', '2017-07-23 05:05:01');
INSERT INTO `myTable` (`id_cliente`, `device`, `fecha_solicitud_crm`, `id_ciclo`, `FECHA_INICIO`, `FECHA_FIN`) VALUES ('cod6-b1e2-4192-8f33-12345676ac1', '60601234567520152', '2017-08-17', 'C14', '2017-04-30 07:03:09', '2017-07-25 05:05:02');

【问题讨论】:

  • 您有可以发布的示例数据吗?这样更容易确定问题的原因。
  • 我无法重现该问题,请参阅db-fiddle
  • @wchiquito,非常感谢您的回答。我已经发布了查询检索到的实际数据(我已经更新了主帖)。
  • 你能发布用于构造游标的完整查询吗?我无法重现该问题,请参阅db-fiddle
  • @wchiquito,再次感谢。我已经更新了 db-fiddle。有一个错误,但可能是因为对小提琴的适应。我不知道。

标签: mysql stored-procedures error-handling cursor runtime-error


【解决方案1】:

我还没有修复我的 PL。

也许,有些东西使光标不起作用,但我无法证明。

所以,最后,我把它分成了两个 PL

  • 在第一个 PL 上,游标被声明并检索所有行。
  • 然后,为每一行调用第二个 PL 并生成所有内容。

这很少见,但现在可以了。

希望对您有所帮助。谢谢。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-10-10
    • 1970-01-01
    • 2012-12-22
    • 2013-09-01
    • 2016-02-08
    • 2023-03-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多