Another question that I was asked today: “Can you create an array of a record type in PL/pgSQL?” The answer is yes.
You first have to create a type, which is what you do when you want to create a table with an embedded table. This is a simple full_name record type:
CREATE TYPE full_name AS
( first_name VARCHAR(20)
, middle_name VARCHAR(20)
, last_name VARCHAR(20));
The following DO block shows you how to create a record type array and then print it’s contents in a FOR-LOOP:
DO
$$
DECLARE
-- An array of full_name records.
list full_name[] =
array[('Harry','James','Potter')
,('Ginevra','Molly','Potter')
,('James','Sirius','Potter')
,('Albus','Severus','Potter')
,('Lily','Luna','Potter')];
BEGIN
-- Loop through the integers.
FOR i IN 1..CARDINALITY(list) LOOP
RAISE NOTICE '%, % %', list[i].last_name, list[i].first_name, list[i].middle_name;
END LOOP;
END;
$$;
Since you typically only have a single dimension array with record-type structure, using CARDINALITY is clearer than ARRAY_LENGTH(list,1). If you don’t agree use the latter.
It prints the following:
NOTICE: Potter, Harry James
NOTICE: Potter, Ginevra Molly
NOTICE: Potter, James Sirius
NOTICE: Potter, Albus Severus
NOTICE: Potter, Lily Luna
DO
As always, I hope this helps those looking for a solution to this type of problem.