Search Postgresql Archives

computed values in plpgsql

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



We have a set of tables that we're partitioning by year and month - 
e.g. payments_parent, partitioned into payments_200901, payments200902, ...
and  inquiries_parent, partitioned into inquiries_200901, inquiries_200902, ...

Each table has a timestamp field import_ts that can be used to partition
the data by month. 
The example trigger procs have an IF statement for *each* month that has
a partition - growing as time goes by, so you get some long trigger
procs if you have incoming data over a range

<code><pre>
            IF import_ts::date >= DATE '2009-01-01' and import_ts::date <= DATE '2009-01-31' THEN
                        INSERT INTO payments_200901 VALUES(NEW.*)
            ELSIF import_ts::date >= DATE '2009-02-01' and import_ts::date <= DATE '2009-02-28' THEN
                        INSERT INTO payments_200902 VALUES(NEW.*)
            ...
</pre></code>

Ditto for each other _parent/partition series.
It would be much simpler to compute the table name from the timestamp,
and re-use the proc for both payments and inquiries tables:

<code><pre>
------------------------------------------------------------
CREATE OR REPLACE FUNCTION partition_ins_trigger( ) 
RETURNS TRIGGER AS
$$
DECLARE
    insStmt  text;
    tableName   text;
    tableDate   text;
BEGIN
     tableDate := to_char(NEW.import_ts, '_yyyyMM');
     tableName := replace( TG_RELNAME, '_parent', tableDate );
-- Either
     INSERT INTO tableNAme VALUES(NEW.*)
-- OR
     EXECUTE 'INSERT INTO ' || tableName || ' VALUES( ' || NEW.* || ')';
     RETURN NULL;                                                                                  
END;
 
$$ language 'plpgsql' volatile;
 
CREATE TRIGGER payments_partition_ins_trigger BEFORE INSERT ON payments_parent 
   FOR EACH ROW EXECUTE PROCEDURE partition_ins_trigger();
 
CREATE TRIGGER inquiries_partition_ins_trigger BEFORE INSERT ON inquiries_parent 
   FOR EACH ROW EXECUTE PROCEDURE partition_ins_trigger();
--------------------------------------------------------------
</pre></code>

The problem is that I can't use a computed table name in a plpgsql
INSERT, and I haven't found a way to use the NEW.* values in an EXECUTE
statement. Is there a way to do this, to prevent the long series of IF's
in an INSERT trigger proc?


-- 
Sent via pgsql-general mailing list (pgsql-general@xxxxxxxxxxxxxx)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-general


[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Index of Archives]     [Postgresql Jobs]     [Postgresql Admin]     [Postgresql Performance]     [Linux Clusters]     [PHP Home]     [PHP on Windows]     [Kernel Newbies]     [PHP Classes]     [PHP Books]     [PHP Databases]     [Postgresql & PHP]     [Yosemite]
  Powered by Linux