Använd %ROWTYPE
i så fall.
Redigera – enkelt fall
Tester av A.H. och DavidEG har visat att detta inte kommer att fungera. Intressant problem!
Du kan prova en lösning . Så länge din definition är som exemplet kan du helt enkelt ta till
CREATE FUNCTION test(param1 comp_type)
RETURNS integer AS
$BODY$
DECLARE
myvar comp_type;
BEGIN
return 1;
END;
$BODY$
LANGUAGE plpgsql VOLATILE;
Men ditt verkliga problem är förmodligen inte så enkelt?
Redigering 2 - det verkliga problemet
Som väntat är det verkliga problemet mer komplext:en polymorf indatatyp .
Lösning för det scenariot var svårare, men borde fungera felfritt:
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;
Ring:
SELECT a FROM test('("foo")'::comp_type); -- just retrieve a, ignore myvar
Se hela resultatet:
SELECT * FROM test('("foo")'::comp_type);
Anmärkning för PostgreSQL 9.0+
Det har skett en avgörande uppdatering i v9.0. Jag citerar release notes :
Ergo, förutom min lösning, kan du använda indatavariabler direkt.
Dynamiska filnamn
- Hur man klona en SPELA IN i PostgreSQL
- Hur man ställer in värdet på det sammansatta variabelfältet med hjälp av dynamisk SQL