如何在游标中使用新值(在插入触发器 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)
我有一个 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)