Объявить переменную типа строки в PL/pgSQL

Как я обнаружил, SELECT * FROM t INTO my_data; работает, только если:

DO $$
DECLARE
my_data t%ROWTYPE;
BEGIN
SELECT * FROM t INTO my_data WHERE id = ?;
END $$;

Я прав?

Если я хочу получить только 2-3 столбца вместо всех столбцов. Как я могу определить my_data?

То есть,

DO $$
DECLARE
my_data <WHAT HERE??>;
BEGIN
SELECT id,name,surname FROM t INTO my_data WHERE id = ?;
END $$;

person Vyacheslav    schedule 02.10.2015    source источник


Ответы (1)


получить только 2-3 столбца вместо всех столбцов

Один из способов: используйте переменную record. :

DO $$
DECLARE
   _rec record;
BEGIN
SELECT INTO _rec
            id, name, surname FROM t WHERE id = ?;
END $$;

Обратите внимание, что структура типа record не определена, пока не назначена. Таким образом, вы не можете ссылаться на столбцы (поля) до того, как сделаете это.

Другой способ: назначить несколько скалярных переменных:

DO $$
DECLARE
   _id int;
   _name text;
   _surname text;
BEGIN
SELECT INTO _id, _name, _surname
             id,  name,  surname FROM t WHERE id = ?;
END $$;

Что касается вашего первого примера: %ROWTYPE - это просто шум в Postgres. Документация:

(Поскольку с каждой таблицей связан составной тип с тем же именем, в PostgreSQL фактически не имеет значения, пишете ли вы %ROWTYPE или нет. Но форма с %ROWTYPE более переносима.)

So:

DO $$
DECLARE
   my_data t;  -- table name serves as type name, too. 
BEGIN
   SELECT INTO my_data  * FROM t WHERE id = ?;
END $$;
person Erwin Brandstetter    schedule 02.10.2015
comment
Последняя часть возвращает ОШИБКУ: отношение my_data не существует - person Raj Shah; 04.05.2020
comment
@RajShah: Если таблица не находится в текущем search_path, вы должны квалифицировать схему обоих экземпляров: my_schema.my_data - что в любом случае является безопасным маршрутом. См.: stackoverflow.com/a/9067777/939860 и stackoverflow.com/a/24089729/939860 - person Erwin Brandstetter; 04.05.2020