Использование команды SELECT INTO

Статья основана на девятом видео из 31 темы курса SQL 2.0 — PL/pgSQL в PostgreSQL от Аристова Евгения, который является логическим продолжением курса SQL c 0. Ссылки на видео на платформах RUTUBE и VK видео.

В данной статье подробно разбираются использование команды SELECT INTO, варианты использования и его ограничения.

В прошлой статье мы разобрали переменную типа record, варианты использования и ограничения.

Презентация и исходники доступны по ссылке.

SELECT … INTO …

Выполнение запроса, возвращающего не более одной строки в переменную

Результат SQL-команды, возвращающей одну строку (возможно из нескольких столбцов), может быть присвоен переменной типа record, переменной строкового типа или списку скалярных переменных — цель. Для этого нужно к основной команде SQL добавить предложение INTO. Так, например:

  • SELECT список_полей INTO [STRICT] цель FROM …;

Предложение INTO указывается сразу после списка полей и перед FROM. Далее в хранимой процедуре мы можем обращаться к этим переменным.

Кроме этого, мы также можем получать и результаты исполнения DML запросов — указав INTO цель в конце запроса:

  • DELETE … RETURNING список_полей INTO [STRICT] цель;
  • INSERT … RETURNING список_полей INTO [STRICT] цель;
  • UPDATE … RETURNING список_полей INTO [STRICT] цель;

Обычно его записывают непосредственно перед или сразу после списка в SELECT или в конце команды для команд других типов.

RETURNING возвратит нам список полей из попавших в условие строк

STRICT

Если указание STRICT отсутствует в предложении INTO, то цели присваивается первая строка, возвращённая запросом; или NULL, если запрос не вернул строк. Все остальные строки результата после первой игнорируются.

Можно проверить специальную переменную FOUND, чтобы определить, была ли возвращена запись:

SELECT * INTO myrec FROM emp WHERE empname = myname;
IF NOT FOUND THEN
  RAISE EXCEPTION 'Сотрудник % не найден', myname; – более подробно в 26 теме
END IF;

PostgreSQL: Documentation: 41.5. Basic Statements

Если добавлено указание STRICT, то запрос должен вернуть ровно одну строку или произойдёт ошибка во время выполнения: либо NO_DATA_FOUND (нет строк), либо TOO_MANY_ROWS (слишком много строк). Можно использовать секцию исключений в блоке для обработки ошибок, например:

BEGIN
  SELECT * INTO STRICT myrec FROM emp WHERE emp_name = name;
  EXCEPTION
    WHEN NO_DATA_FOUND THEN
      RAISE EXCEPTION 'Сотрудник % не найден', name;
    WHEN TOO_MANY_ROWS THEN
      RAISE EXCEPTION 'Сотрудник % уже существует', name;
END;

Больше примеров доступно на гитхабе и в видео.

В следующей статье мы разберём возвращение множеств (setof) и таблиц (table).


Опубликовано

в

Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

13 − двенадцать =