Статья основана на девятом видео из 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).
Добавить комментарий