yes, i was trying to do something like that, but it breaks always in the same place, first I thought that it was because of the way I was assigning values to the fields of my row, but now I'm beginning to think that the reason is the way I pass the row to f2.
Here is the error: franco=# SELECT f1(); WARNING: Error occurred while executing PL/pgSQL function f1 WARNING: line 5 at select into variables ERROR: Attribute "result" not found CREATE TYPE mytype AS (val1 INTEGER, val2 INTEGER, val3 INTEGER); CREATE OR REPLACE FUNCTION f1() RETURNS mytype AS ' DECLARE result mytype%ROWTYPE; BEGIN result.val1:=1; SELECT val2, val3 INTO result.val2, result.val3 FROM f2(result); RETURN result; END; ' LANGUAGE 'plpgsql'; CREATE OR REPLACE FUNCTION f2(mytype) RETURNS mytype AS ' DECLARE arg ALIAS FOR $1; result mytype%ROWTYPE; BEGIN arg.val2:=2; arg.val3:=3; SELECT arg.val1, arg.val2, arg.val3 INTO result.val1, result.val2, result.val3; RETURN result; END; ' LANGUAGE 'plpgsql'; what do you guys think? On Saturday 29 March 2003 13:49, Joe Conway wrote: > Franco Bruno Borghesi wrote: > > ok, soy you're telling me that the only way to return a composite type is > > using a set of them, even if I know my function will allways return 1 > > record. > > Try this: > > create type foo as (f1 int, f2 text); > create or replace function retfoo(int, text) returns foo as ' > declare > result foo%ROWTYPE; > begin > select into result $1, $2; > return result; > end; > ' language 'plpgsql'; > > regression=# select * from retfoo(2,'b'); > f1 | f2 > ----+---- > 2 | b > (1 row) > > Joe
pgp00000.pgp
Description: signature