Курсор MySQL с несколькими значениями в переменной?

У меня есть что-то вроде этого в триггере:

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]
            )

В чем причина обрабатывать строки одну за другой, когда вам нужно, чтобы все значения были получены в одной переменной? Используйте один агрегированный запрос вместо курсора и агрегируйте все значения в одну строку CSV или массив JSON.

Akina 12.05.2022 12:31
SQL возвращает несколько строк Разве thing.id не является ПЕРВИЧНЫМ КЛЮЧОМ?
Akina 12.05.2022 12:32

Итак, как я могу объединить их в массив JSON (я хочу INSERT его позже в триггере) (это сводная таблица, я на самом деле пытаюсь получить все связанные записи)?

Mick 12.05.2022 12:33
Функция JSON_ARRAYAGG
Akina 12.05.2022 12:35

Ваш вопрос выглядит как XY-задача. Может полезнее выложить саму задачу?

Akina 12.05.2022 12:36
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
В предыдущем посте мы создали функциональность вставки и чтения для нашей динамической СУБД. В этом посте мы собираемся реализовать функции обновления...
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
Роли и разрешения пользователей без пакета Laravel 9
Роли и разрешения пользователей без пакета Laravel 9
Этот пост изначально был опубликован на techsolutionstuff.com .
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
В предыдущей статье мы завершили установку базы данных, для тех, кто не знает.
1
5
23
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Для записи: нет, невозможно хранить несколько значений в скалярной переменной.

Я действительно думаю, что есть лучший способ выполнить то, что вы описываете. Большинство случаев использования 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;

Да, спасибо. Это в значительной степени то, где я оказался.

Mick 12.05.2022 17:48

Другие вопросы по теме