Gebruik %ROWTYPE
in dat geval.
Bewerken - eenvoudig geval
Tests door A.H. en DavidEG hebben aangetoond dat dit niet werkt. Interessant probleem!
Je zou een oplossing kunnen proberen . Zolang je definitie hetzelfde is als het voorbeeld, kun je gewoon je toevlucht nemen tot
CREATE FUNCTION test(param1 comp_type)
RETURNS integer AS
$BODY$
DECLARE
myvar comp_type;
BEGIN
return 1;
END;
$BODY$
LANGUAGE plpgsql VOLATILE;
Maar uw echte probleem is waarschijnlijk niet zo eenvoudig?
Bewerken 2 - het echte probleem
Zoals verwacht is het echte probleem complexer:een polymorf invoertype .
Oplossing voor dat scenario was moeilijker, maar zou feilloos moeten werken:
CREATE FUNCTION test(param1 anyelement, OUT a integer, OUT myvar anyelement)
RETURNS record AS
$BODY$
BEGIN
myvar := $1; -- myvar has now the required type.
--- do stuff with myvar.
myvar := NULL; -- reset if you don't want to output ..
a := 1;
END;
$BODY$
LANGUAGE plpgsql VOLATILE;
Bel:
SELECT a FROM test('("foo")'::comp_type); -- just retrieve a, ignore myvar
Zie volledige output:
SELECT * FROM test('("foo")'::comp_type);
Opmerking voor PostgreSQL 9.0+
Er is een cruciale update geweest in v9.0. Ik citeer de release-opmerkingen :
Ergo, naast mijn tijdelijke oplossing, kun je invoervariabelen direct gebruiken.
Dynamische bestandsnamen
- Hoe een RECORD in PostgreSQL
- Hoe de waarde van het samengestelde variabele veld in te stellen met behulp van dynamische SQL