У меня есть что-то вроде этого в триггере:
OPEN cursor_things;
loop_through_rows : LOOP
FETCH cursor_things INTO things;
IF done THEN
LEAVE loop_through_rows;
END IF ;
END LOOP;
CLOSE cursor_things;
Где находится SQL:
DECLARE cursor_things CURSOR FOR
SELECT id
FROM things
WHERE thing.id = OLD.id;
Проблема в том, что SQL возвращает несколько строк, и переменная перезаписывается. Есть ли способ сохранить несколько значений в переменной? В качестве альтернативы, есть ли лучший способ сделать это?
Обновлено: Курсор может быть не лучшим решением. Первоначально я просто пробовал переменную:
Если у нас есть книги и таблицы авторов. Авторы написали много книг. Я хочу получить все идентификаторы из таблицы книг
Я просто хочу иметь возможность сделать это:
INSERT INTO changes (`action`, `data`)
VALUES ('changed',
JSON_OBJECT(
'author', NEW.author,
'book_ids', #how do I get these ids
)
);
Так что, может быть, с чем-то вроде этого:
SET bookIds = (SELECT JSON_ARRAYAGG( book_id) from books WHERE author_id = 13);
и немного подробнее, что мне действительно нужно:
JSON_OBJECT(
'author', NEW.author,
'books', [
[related book1 id, related book1 type],
[related book2 id, related book2 type]
)
thing.id не является ПЕРВИЧНЫМ КЛЮЧОМ?
Итак, как я могу объединить их в массив JSON (я хочу INSERT его позже в триггере) (это сводная таблица, я на самом деле пытаюсь получить все связанные записи)?
Ваш вопрос выглядит как XY-задача. Может полезнее выложить саму задачу?






Для записи: нет, невозможно хранить несколько значений в скалярной переменной.
Я действительно думаю, что есть лучший способ выполнить то, что вы описываете. Большинство случаев использования CURSOR в процедуре MySQL можно выполнить в одном запросе, а не в цикле. Например:
INSERT INTO changes (`action`, `data`)
SELECT 'changed', JSON_OBJECT()
'author', NEW.author,
'books', JSON_ARRAYAGG(
JSON_OBJECT(
'book_id', id,
'book_type', book_type
)
)
FROM books
WHERE author_id = NEW.author;
Да, спасибо. Это в значительной степени то, где я оказался.
В чем причина обрабатывать строки одну за другой, когда вам нужно, чтобы все значения были получены в одной переменной? Используйте один агрегированный запрос вместо курсора и агрегируйте все значения в одну строку CSV или массив JSON.