2016-08-18 82 views
1

我有一個用戶定義的複合數據類型的數組。我需要對plpgsql函數中的數組元素進行一些操作,但是我沒有獲得訪問各個元素的語法權限。任何幫助表示讚賞。下面粘貼的是代碼的簡化版本。訪問複合數組元素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; 

當我嘗試執行此操作時出現以下錯誤。

錯誤:語法錯誤處於或接近「。」。 LINE 5:mod [i] .a = 1;

我使用的是Postgres 9.2

回答

3

左邊的表達式在PLpgSQL中必須非常簡單。不支持數組和複合類型的組合。您應該設置複合類型的值,然後將此值分配給數組。

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; 

有可能的快捷方式:

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

以上帕維爾的回答之後,你就可以進一步簡化此爲普通的SQL函數(它給你更好的規劃師的透明度和類型檢查),如果你做類似:

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; 

我通常嘗試使用普通的SQL函數時,我可以(PL/pgsql填補了一個非常重要的利基雖然)。