2016-08-18 2 views
1

Ich habe ein Array von benutzerdefinierten zusammengesetzten Datentyp. Ich muss etwas an den Array-Elementen in der Funktion plpgsql vornehmen, aber ich bekomme nicht die Syntax, um auf die einzelnen Elemente zuzugreifen. Jede Hilfe wird geschätzt. Unten ist eine vereinfachte Version des Codes eingefügt.Zugriff auf Composite-Array-Elemente plpgsql

CREATE TYPE playz AS(
        a integer, 
        b numeric, 
        c integer, 
        d numeric); 

CREATE OR REPLACE FUNCTION playx(OUT mod playz[]) AS $$ 
BEGIN 
    FOR i in 1..5 LOOP 
     mod[i].a = 1; 
     mod[i].b = 12.2; 
     mod[i].c = 1; 
     mod[i].d = 0.02; 

    END LOOP; 
END; 
$$ LANGUAGE plpgsql; 

Ich bekomme den folgenden Fehler, wenn ich versuche, dies auszuführen.

Fehler: Syntaxfehler bei oder nahe "." Zeile 5: mod [i] .a = 1;

Ich bin mit Postgres 9.2

Antwort

3

Die linken Ausdrücke müssen ziemlich einfach in plpgsql sein. Die Kombination aus Array und zusammengesetztem Typ wird nicht unterstützt. Sie sollten einen Wert vom zusammengesetzten Typ festlegen und dann diesen Wert dem Array zuweisen.

CREATE OR REPLACE FUNCTION playx(OUT mod playz[]) AS $$ 
DECLARE r playz; 
BEGIN 
    FOR i in 1..5 LOOP 
    r.a = 1; 
    r.b = 12.2; 
    r.c = 1; 
    r.d = 0.02; 
    mod[i] = r; 
    END LOOP; 
END; 
$$ LANGUAGE plpgsql; 

Es ist möglich, eine Abkürzung

CREATE OR REPLACE FUNCTION public.playx(OUT mod playz[]) 
LANGUAGE plpgsql 
AS $function$ 
BEGIN 
    FOR i in 1..5 LOOP 
    mod[i] = ROW(1, 12.2, 1, 0.02); 
    END LOOP; 
END; 
$function$; 
0

oben auf Pavel Antwort Anknüpfend können Sie weiter vereinfachen diese in eine einfache SQL-Funktion (die Sie Transparenz besser Planer gibt und Typprüfung), wenn Sie so etwas wie:

CREATE OR REPLACE FUNCTION playx(OUT mod playz[]) AS $$ 
select array_agg(row(1, 12.2, 1, 0.02)::playz) 
    from generate_series(1, 5) 
$$ LANGUAGE sql; 

ich versuche in der Regel schlicht SQL-Funktionen zu verwenden, wenn ich kann (pl/pgsql eine sehr wichtige Nische füllt obwohl).

Verwandte Themen