在postgresql中插入动态表分区并返回

时间:2017-05-19 08:08:08

标签: postgresql

我创建了一个表分区,如果它还不存在表名,则会创建一个表。我需要这个函数来返回插入的ID,但我得到列“分区”的错误不存在似乎我的架构(分区)被认为是此代码中的列

CREATE OR REPLACE FUNCTION partition.itinerary_partition_function()
RETURNS TRIGGER AS 
$BODY$
DECLARE
    reflowId bigint;
    _tablename text;
    _startyear text;
    _startmonth text;
    _fulltablename text;
BEGIN
    --Takes the current inbound "time" value and determines when midnight is for the given date
    _startyear := to_char(now(), 'YYYY');
    _startmonth := to_char(now(), 'MM');
    _tablename := 'itinerary_'||_startyear || '_' || _startmonth;
    _fulltablename := 'partition.' || _tablename;

    -- Check if the partition needed for the current record exists
    PERFORM 1
    FROM   pg_catalog.pg_class c
    JOIN   pg_catalog.pg_namespace n ON n.oid = c.relnamespace
    WHERE  c.relkind = 'r'
    AND    c.relname = _tablename
    AND    n.nspname = 'partition';

    -- If the partition needed does not yet exist, then we create it:
    -- Note that || is string concatenation (joining two strings to make one)
    IF NOT FOUND THEN
        EXECUTE 'CREATE TABLE partition.' || quote_ident(_tablename) || '()INHERITS (partition.itinerary)';

        -- Table permissions are not inherited from the parent.
        -- If permissions change on the master be sure to change them on the child also.
        EXECUTE 'ALTER TABLE partition.' || quote_ident(_tablename) || ' OWNER TO postgres';

        -- Indexes are defined per child, so we assign a default index that uses the partition columns
        EXECUTE 'CREATE INDEX ' || quote_ident(_tablename||'_indx1') || ' ON partition.' || quote_ident(_tablename) || ' (id)';
    END IF;

    BEGIN
        EXECUTE format('INSERT INTO %I SELECT $1.*', "partition." || _tablename)
        USING NEW;
        RETURN NEW; 
    END;
END;
$BODY$
LANGUAGE plpgsql;

在此代码之后,我在另一个插入函数

中调用它
CREATE OR REPLACE FUNCTION partition.insert_data(username text,jsonData jsonb) RETURNS bigint AS
$$
DECLARE reflowId bigint;
BEGIN
    INSERT INTO reflow_partition.itinerary(username, data)
    VALUES (username, jsonData) RETURNING id;
END;
$$
LANGUAGE plpgsql;

1 个答案:

答案 0 :(得分:0)

尝试更改此内容:

EXECUTE format('INSERT INTO %I SELECT $1.*', "partition." || _tablename)

到此:

EXECUTE format('INSERT INTO %1$I.%2$I SELECT $1.*', 'partition', _tablename)