Użyj %ROWTYPE
w takim przypadku.
Edytuj – prosty przypadek
Testy przeprowadzone przez AH i DavidEG wykazały, że to nie zadziała. Interesujący problem!
Możesz wypróbować obejście . Dopóki twoja definicja jest podobna do przykładu, możesz po prostu się do niej odwołać
CREATE FUNCTION test(param1 comp_type)
RETURNS integer AS
$BODY$
DECLARE
myvar comp_type;
BEGIN
return 1;
END;
$BODY$
LANGUAGE plpgsql VOLATILE;
Ale twój prawdziwy problem prawdopodobnie nie jest taki prosty?
Edytuj 2 — prawdziwy problem
Zgodnie z oczekiwaniami, prawdziwy problem jest bardziej złożony:polimorficzny typ danych wejściowych .
Obejście dla tego scenariusza było trudniej, ale powinno działać bezbłędnie:
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;
Zadzwoń:
SELECT a FROM test('("foo")'::comp_type); -- just retrieve a, ignore myvar
Zobacz pełne dane wyjściowe:
SELECT * FROM test('("foo")'::comp_type);
Uwaga dla PostgreSQL 9.0+
W wersji 9.0 pojawiła się kluczowa aktualizacja. Cytuję informacje o wydaniu :
Ergo, oprócz mojego obejścia, możesz bezpośrednio wykorzystać zmienne wejściowe.
Dynamiczne nazwy pól
- Jak sklonować RECORD w PostgreSQL
- Jak ustawić wartość pola zmiennej złożonej za pomocą dynamicznego SQL