2016-06-23 3 views
0

Я пытаюсь вставить значения в цикле в таблицу, но я не могу это сделать, так как моя ошибка сбрасывания функции.Как вставить данные в таблицу во время цикла в postgresql?

Я хочу вставить данные, получаемые из выбранного состояния в базовую таблицу 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

Я думаю, что это не запрос. Таким образом, возвращаемое значение должно аннулированию как то

RETURNS VOID 

вместо

RETURN QUERY 

Кроме того, необходимо заменить OUT с IN для параметра

0

Если вы хотите вернуть только вставленные строки, вам нужно использование 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; 
$$ 
; 
Смежные вопросы