Thread: array of composite types - how can I launch this function with an array of composite values

I have a composite type, like
--
CREATE TYPE requirement_vo AS (
 name VARCHAR(20),
 description VARCHAR(20),
 requirement_id INT,
 requirement_type_id INT,
 priority_id INT,
 necessity_id INT,
 lower_limit DOUBLE PRECISION,
 upper_limit DOUBLE PRECISION
 );
--
and I have a function
--
CREATE OR REPLACE FUNCTION add_position(rs requirement_vo[] )
--


Code like this
--
SELECT * FROM add_position('{("name", "descr", "req_id", "req_type_id",
"priority_id", "nec_id", 2.1321, 1.2323)}');
--
returns "ERROR: malformed array literal: "{("name", "descr", "req_id",
"req_type_id",
"priority_id", "nec_id", 2.1321, 1.2323)}"
SQL state: 22P02
"

So the question is - how can I launch this function with an array of
composite values?
Documentation (http://www.postgresql.org/docs/8.3/interactive/arrays.html)
says "Arrays of ... or composite type can be created."

Nikita Koselev

"Nikita Koselev" <koselev@gmail.com> writes:
> SELECT * FROM add_position('{("name", "descr", "req_id", "req_type_id",
> "priority_id", "nec_id", 2.1321, 1.2323)}');

Parentheses are not part of the array-literal syntax.  You'd need
something more like
    '{"(\"name\", \"descr\", ...)"}'
and the backslashes would have to be doubled if this is an old-style
string literal.

Personally I'd avoid the thicket of quoting rules and build up the value
using SQL constructs:
    array[row('name', 'descr', ...)::requirement_vo, row(...), ...]
I think casting the first row() to the desired rowtype is probably
sufficient, though it might depend on which PG version you're using.

            regards, tom lane