PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Deklarieren Sie eine Variable des zusammengesetzten Typs in PostgreSQL mit %TYPE

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