2017-10-17 13 views
1

私はPostgres 10のパーティションをBY RANGE(date_created)の巨大なテーブルに自動化しようとしています。Postgres 10でパーティション作成を自動化

私はパーティションテーブルの自動作成がないことに気づいたので、これらのテーブルの作成を自動化する手順を記述したいと思います。

私はそのような何か考えていた:

CREATE OR REPLACE FUNCTION cdi.automating_partitions() 
RETURNS TABLE(natural_id text, name text, natural_id_numeric text) AS 
$func$ 
DECLARE 
    formal_table text; 
BEGIN 
    FOR formal_table IN 
     select '2017-01-01'::date + (n || ' months')::interval months, 
     '2013-02-01'::date + (n || ' months')::interval monthsplus 
     from generate_series(0, 12) n 
    LOOP 
     RETURN QUERY EXECUTE 
    'CREATE TABLE cdi.' || 'document' || to_char(months, 'YYYY') || '' || to_char(months, 'MM') || ' PARTITION OF cdi.document 
FOR VALUES FROM (''' || to_char(months, 'YYYY') || to_char(months, 'MM') || ''', 
''' to_char(monthsplus, 'YYYY') || to_char(monthsplus, 'MM') ''');' 
    END LOOP; 
END 
$func$ LANGUAGE plpgsql; 

をしかし、私ははっきりと読みやすいコードを取得するためにexecuteと連動して機能format()を使用します(

+2

PL/pgSQLブロックの外部で 'execute'を使用することはできません(SQLクエリの一部ではありません)。 –

+1

あなたはどんなエラーを受けていますか? – JustMe

答えて

1

の近くに構文エラーを取得し、例:

do $do$ 
declare 
    d date; 
begin 
    for d in 
     select generate_series(date '2017-01-01', date '2017-12-01', interval '1 month') 
    loop 
    execute format($f$ 
     create table cdi.document%s%s partition of cdi.document 
     for values from (%L) to (%L) 
     $f$, 
     to_char(d, 'YYYY'), to_char(d, 'MM'), d, d+ interval '1 month'); 
    end loop; 
end 
$do$ 

anonymous code blockを使用しました。create table ...は結果を生成しませんが、関数を書く場合は、関数がvoidを返し、RETURN QUERYを使用しないように注意してください。

関連する問題