PostgreSQL | Как вернуть из функции идентификатор вставки записи в таблицу? — efim360.ru

PostgreSQL | Как вернуть из функции идентификатор вставки записи в таблицу?

Когда мы пишем стандартный код вставки записи в таблицу в PostgreSQL, то мы можем указать для команды INSERT атрибут RETURNING.

Справа от RETURNING мы должны указать имя столбца, по которому нужно возвращать значение.

Одна вставка - один возврат.

Пример:

insert into test1.cars (brand, model, year, mileage, price, color, typeengine)
values ('Volkswagen', 'Touareg', 2006, 227000, 550000, 'Синий', 'Дизель') RETURNING id;

Вернёт целочисленное значение из ячейки пересечения первичного ключа (ID) и строчки новой записи.

Сделали вставку в таблицу и вернули идентификатор записи - PostgreSQL
Сделали вставку в таблицу и вернули идентификатор записи - PostgreSQL

С обычным INSERT всё ясно, но как быть с функцией? Как передать строку в функцию, потом произвести вставку и только потом вернуть id?

 

Функция, возвращающая идентификатор вставленной в таблицу записи

-- РАБОЧАЯ. Нужно два INTO INTO

 

CREATE OR REPLACE FUNCTION a.a2(str text)

RETURNS bigint

LANGUAGE 'plpgsql'

AS $BODY$

    DECLARE pkeyfrominsert bigint;

    BEGIN

        INSERT INTO a.t_dname (dname) values (str) RETURNING id INTO pkeyfrominsert;

        RETURN pkeyfrominsert;

    END;

$BODY$;

 

-- Вызов функции с параметром

SELECT a.a2('efim360');

SELECT a.a2('efim');

 

-- Удаление функции

DROP FUNCTION a.a2(str text);

 

Ключевой момент в работе этой функции - ИСПОЛЬЗУЮТСЯ ДВА INTO INTO ! ! !:

  1. Мы также используем вставку записи INSERT INTO в теле функции, но ...
  2. Мы добавляем после RETURNING id слово INTO и далее записываем наш идентификатор привязки (наше название переменной)
  3. Мы возвращаем нашу переменную при помощи команды RETURN

В нашем примере мы передаём строку, а в ответ получаем идентификатор вставленной в таблицу записи. В таблице у нас работает автоинкремент, поэтому если вставка не осуществится, то значение последовательности всё равно увеличится на единицу.

 

Пример вставки и возврата

Функция, возвращающая идентификатор вставки записи в таблицу - PostgreSQL
Функция, возвращающая идентификатор вставки записи в таблицу - PostgreSQL

 

Информационные ссылки

PostgreSQL | Как создать переменную в теле функции?

PostgreSQL | Функция проверки наличия пробелов в строке данных или строке запроса с клиента

Официальный сайт PostgreSQL - https://www.postgresql.org

Команды SQL - https://postgrespro.ru/docs/postgresql/14/sql-commands

Команда CREATE FUNCTION - https://postgrespro.ru/docs/postgresql/14/sql-createfunction

Команда DROP FUNCTION - https://postgrespro.ru/docs/postgresql/14/sql-dropfunction

Команда SELECT - https://postgrespro.ru/docs/postgresql/14/sql-select

Команда INSERT - https://postgrespro.ru/docs/postgresql/14/sql-insert

Раздел "9.4. Строковые функции и операторы" - https://postgrespro.ru/docs/postgresql/14/functions-string

Раздел "43.6. Управляющие структуры" - https://postgrespro.ru/docs/postgresql/14/plpgsql-control-structures

Графический интерфейс pgAdmin - https://www.pgadmin.org