sql >> Databasteknik >  >> RDS >> PostgreSQL

Deklarera variabel av sammansatt typ i PostgreSQL med %TYPE

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




  1. Aktiverar mikrosekunder i Symfony2 (doktrin) och MySQL

  2. Sqlite eller MySql? Hur bestämmer man sig?

  3. postgres:få körbar fråga från fråga med parametrar

  4. Hur man får antal specifika rader från en annan tabell i en underfråga