tgl@xxxxxxxxxxxxx wrote:bryn@xxxxxxxxxxxx writes: Thanks for the clue. Your "select 17, 42 into r2" does indeed work. But I can't find a way to act on your "If you want to assign a composite value to the whole target… use an assignment statement". Here's my test. It's closer to what I wanted to do. I wanted to assign a value to a PL/pgSQL variable whose data type is a composite type from component values from a table. And I happened to start off with "select into" rather than with a subquery on the RHS of an assignment. In another context, I want to construct a value of my composite type from variables that represent its components. create table s.t(k int primary key, c1 int, c2 int); insert into s.t(k, c1, c2) values(1, 17, 42); create type s.x as (c1 int, c2 int); create function s.f() returns table(z text) security definer set search_path = pg_catalog, pg_temp language plpgsql as $body$ declare my_c1 int := 17; my_c2 int := 42; r s.x; txt text; begin r := (select (a.c1, a.c2)::s.x from s.t a where a.k = 1); z := (r.c1)::text||' / '||(r.c2)::text; return next; select a.c1, a.c2 into r from s.t a where a.k = 1; z := (r.c1)::text||' / '||(r.c2)::text; return next; begin r := (my_c1, my_c2)::s.t; exception when cannot_coerce then z := '"cannot_coerce" handled.'; return next; end; r.c1 := my_c1; r.c2 := my_c2; z := (r.c1)::text||' / '||(r.c2)::text; return next; end; $body$; select s.f(); This is specific to "language plpgsql" subprograms. So I should find the rules that I need to understand in "Chapter 43. PL/pgSQL - SQL Procedural Language" (www.postgresql.org/docs/11/plpgsql.html). But I can't. However, I'm not very good at finding the relevant doc when I need it. Where is it? Going from what you said, and my most recent test, here, the rules seem to be inscrutable—and non-composable. I wonder if it all boils down to the strange-to-me anonymous, polymorphic "record" notion. |