如何在游标中使用新值(在插入触发器 Mysql 之后)

How to use NEW value in cursor (after insert trigger Mysql)

我有一个 table 可以在插入后使用 trigger.i 想使用游标来循环 perpose logic.I 已经尝试过这个来简单地声明游标

DECLARE demo_cursor CURSOR FOR SELECT * FROM tbl_demo WHERE id=NEW.id;

但是它不起作用,但是当像这样使用 NEW.id 的静态安装时它工作正常

DECLARE demo_cursor CURSOR FOR SELECT * FROM tbl_demo WHERE id=5;

出了什么问题。

提前致谢

我无法重现问题。

mysql> DROP TABLE IF EXISTS `tbl_demo`, `result_demo`;
Query OK, 0 rows affected (0.01 sec)

mysql> CREATE TABLE IF NOT EXISTS `tbl_demo` (
    ->   `id` INT,
    ->   `value` VARCHAR(50)
    -> );
Query OK, 0 rows affected (0.00 sec)

mysql> CREATE TABLE IF NOT EXISTS `result_demo` (
    ->   `id` INT,
    ->   `value` VARCHAR(50)
    -> );
Query OK, 0 rows affected (0.00 sec)

mysql> DELIMITER //

mysql> CREATE TRIGGER `trg_after_insert` AFTER INSERT ON `tbl_demo`
    -> FOR EACH ROW
    -> BEGIN
    ->   DECLARE `done` BOOL DEFAULT FALSE;
    ->   DECLARE `_id` INT;
    ->   DECLARE `_value` VARCHAR(50);
    -> 
    ->   DECLARE `demo_cursor` CURSOR FOR
    ->   SELECT * -- <- SELECT `id`, `value` Recommendation for use
    ->   FROM `tbl_demo`
    ->   WHERE `id` = NEW.`id`;
    ->   DECLARE CONTINUE HANDLER FOR NOT FOUND SET `done` := TRUE;
    -> 
    ->   OPEN `demo_cursor`;
    -> 
    ->   `read_loop`: LOOP
    ->     FETCH `demo_cursor` INTO `_id`, `_value`;
    -> 
    ->     IF `done` THEN
    ->       CLOSE `demo_cursor`;
    ->       LEAVE `read_loop`;
    ->     END IF;
    -> 
    ->     INSERT INTO `result_demo`
    ->       (`id`, `value`)
    ->     VALUES
    ->       (`_id`, `_value`);
    ->   END LOOP;
    -> END//
Query OK, 0 rows affected (0.00 sec)

mysql> DELIMITER ;

mysql> INSERT INTO `tbl_demo`
    ->   (`id`, `value`)
    -> VALUES
    ->   (1, 'Value 1'),
    ->   (1, 'Value 2'),
    ->   (1, 'Value 3');
Query OK, 3 rows affected (0.01 sec)
Records: 3  Duplicates: 0  Warnings: 0

mysql> SELECT
    ->   `id`,
    ->   `value`
    -> FROM
    ->   `tbl_demo`;
+------+---------+
| id   | value   |
+------+---------+
|    1 | Value 1 |
|    1 | Value 2 |
|    1 | Value 3 |
+------+---------+
3 rows in set (0.00 sec)

mysql> SELECT
    ->   `id`,
    ->   `value`
    -> FROM
    ->   `result_demo`;
+------+---------+
| id   | value   |
+------+---------+
|    1 | Value 1 |
|    1 | Value 1 |
|    1 | Value 2 |
|    1 | Value 1 |
|    1 | Value 2 |
|    1 | Value 3 |
+------+---------+
6 rows in set (0.00 sec)