Verwenden Sie %ROWTYPE
in diesem Fall.
Bearbeiten - einfacher Fall
Tests von A.H. und DavidEG haben gezeigt, dass dies nicht funktioniert. Interessantes Problem!
Sie könnten einen Workaround versuchen . Solange Ihre Definition dem Beispiel entspricht, können Sie einfach darauf zurückgreifen
CREATE FUNCTION test(param1 comp_type)
RETURNS integer AS
$BODY$
DECLARE
myvar comp_type;
BEGIN
return 1;
END;
$BODY$
LANGUAGE plpgsql VOLATILE;
Aber Ihr eigentliches Problem ist wahrscheinlich nicht so einfach?
Edit 2 - das eigentliche Problem
Wie erwartet ist das eigentliche Problem komplexer:ein polymorpher Eingabetyp .
Problemumgehung für dieses Szenario war schwieriger, sollte aber einwandfrei funktionieren:
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;
Aufruf:
SELECT a FROM test('("foo")'::comp_type); -- just retrieve a, ignore myvar
Siehe vollständige Ausgabe:
SELECT * FROM test('("foo")'::comp_type);
Hinweis für PostgreSQL 9.0+
In v9.0 gab es ein entscheidendes Update. Ich zitiere die Versionshinweise :
Ergo können Sie zusätzlich zu meinem Workaround Eingabevariablen direkt verwenden.
Dynamische Dateinamen
- Wie man a RECORD in PostgreSQL
- So setzen Sie den Wert eines zusammengesetzten Variablenfelds mit dynamischem SQL