2016-06-22 3 views
0

...どのように私がループしながら、複数の列を選択したい、これを行う方法を教えてくださいpostgresqlでループ中に複数の列を選択する方法は?

create or replace function insert_date_dimension("date" date) 
returns setof date as $$ 
declare 
    dat date; 
    start_date date; 
    end_date date; 
begin 
    start_date := '2016/01/01'; 
    end_date := '2016/12/31'; 
    while start_date <= end_date loop 
     --return next start_date; 
     select start_date,date_part('week',start_date),date_part('quarter',start_date),to_char(start_date, 'day'),to_char(start_date, 'month'), 
     extract(year from current_date),extract(month from current_date); 
     start_date:= start_date + interval '1 day'; 
    end loop; 
end; 

$$言語plpgsqlが、

ERROR: query "SELECT start_date,date_part('week',start_date),date_part('quarter',start_date),to_char(start_date, 'day'),to_char(start_date, 'month'), 
     extract(year from current_date),extract(month from current_date)" returned 7 columns 

CONTEXT:PL/pgSQLの関数insert_date_dimension(日)11行RETURN NEXTで

答えて

0

あなたはPL/pgSQL関数でSELECT ... INTO ...を使用する必要があるため、エラーが発生します。また、RETURN何かを忘れてしまった。

generate_seriesははるかに簡単です。あなたはおそらく関数を定義する必要はないので、ちょうどINSERT INTO ... SELECT ...を使うことができます。ここで

は、私はそれを書くと同じように機能です:

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 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;$$; 
関連する問題