2016-06-23 17 views
0

テーブルへのループに値を挿入しようとしていますが、エラーがスローされてから機能しません。postgresqlでループ中にテーブルにデータを挿入するには?

select statmentからベーステーブルDate_Dimにデータを挿入したいとします。

CREATE OR REPLACE FUNCTION insert_date_dimension(
OUT "date" date, 
OUT week integer, 
OUT quarter integer, 
OUT dayname text, 
OUT monthname text, 
OUT year integer, 
OUT month integer 
) RETURNS SETOF RECORD STABLE LANGUAGE plpgsql AS 
$$DECLARE 
dat date; 
start_date timestamp := '2016-01-01 00:00:00'; 
end_date timestamp := '2016-12-31 00:00:00'; 
BEGIN 
    RETURN QUERY 
    insert into date_dim 
    SELECT 
     d::date, 
     date_part('week', d)::integer, 
     date_part('quarter', d)::integer, 
     to_char(d, 'day'), 
     to_char(d, 'month'), 
     date_part('year', d)::integer, 
     date_part('month', d)::integer 
    FROM generate_series(start_date, end_date, '1 day') d(d); 
END;$$; 
ERROR: cannot open INSERT query as cursor 
CONTEXT: PL/pgSQL function insert_date_dimension() line 6 at RETURN QUERY 

答えて

0

私はそれが選択クエリではないと思います。だから、値はまた、あなたはただ挿入された行を返したい場合は、あなたがする必要があるパラメータ

0

ため、INとOUT交換する必要があること

RETURNS VOID 

代わりの

RETURN QUERY 

のように無効にする必要があり戻ります使用returning

returns setof date_dim

を使用して関数の宣言を簡略化することもできます
CREATE OR REPLACE FUNCTION insert_date_dimension() 
    RETURNS SETOF date_dim 
    LANGUAGE plpgsql 
AS 
$$ 
DECLARE 
dat date; 
start_date timestamp := '2016-01-01 00:00:00'; 
end_date timestamp := '2016-12-31 00:00:00'; 
BEGIN 
    RETURN QUERY 
    insert into date_dim 
    SELECT 
     d::date, 
     date_part('week', d)::integer, 
     date_part('quarter', d)::integer, 
     to_char(d, 'day'), 
     to_char(d, 'month'), 
     date_part('year', d)::integer, 
     date_part('month', d)::integer 
    FROM generate_series(start_date, end_date, '1 day') d(d) 
    returning *; --<< HERE 
END; 
$$ 
; 
関連する問題