Hello,

I was trying to do auto partitioning in PostgreSQL 10.
First of all, I created 2 tables t_dossier_bac_history_insert_table and 
t_dossier_bac_history_sensor_collections.
And then, I created a trigger which would execute a function (which would 
create my partitions) before inputting data in 
t_dossier_bac_history_insert_table.
But, I am having an error which is as follows when I try to insert data from an 
existing table to t_dossier_bac_history_insert_table:

ERROR: query string argument of EXECUTE is null CONTEXT: PL/pgSQL function 
sensor_partition() line 27 at EXECUTE SQL state: 22004

Could you please help me in resolving this issue.
Please see below for part of my codes.
Thank you in advance.

-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
CREATE TABLE t_dossier_bac_history_insert_table
(
    id_dossier_bac_history character(32) COLLATE pg_catalog."default" NOT NULL,
    boo_supprime boolean,
    dat_create timestamp without time zone DEFAULT timezone('utc'::text, now()),
    dat_supprime timestamp without time zone,
    dat_update timestamp without time zone,
    num_version bigint NOT NULL,
    dat_date_entree timestamp without time zone,
    dat_date_sortie timestamp without time zone,
    id_bac character(32) COLLATE pg_catalog."default" NOT NULL,
    id_dossier character(32) COLLATE pg_catalog."default" NOT NULL,
    boo_en_migration boolean DEFAULT false

)
WITH (
    OIDS = FALSE
)
TABLESPACE pg_default;


CREATE TABLE t_dossier_bac_history_sensor_collections
(
    id_dossier_bac_history character(32) COLLATE pg_catalog."default" NOT NULL,
    boo_supprime boolean,
    dat_create timestamp without time zone DEFAULT timezone('utc'::text, now()),
    dat_supprime timestamp without time zone,
    dat_update timestamp without time zone,
    num_version bigint NOT NULL,
    dat_date_entree timestamp without time zone,
    dat_date_sortie timestamp without time zone,
    id_bac character(32) COLLATE pg_catalog."default" NOT NULL,
    id_dossier character(32) COLLATE pg_catalog."default" NOT NULL,
    boo_en_migration boolean DEFAULT false

)
PARTITION BY LIST (id_bac)
WITH (
    OIDS = FALSE
)
TABLESPACE pg_default;


CREATE TRIGGER insert_to_t_dossier_bac_history_sensor_collections
BEFORE INSERT
ON t_dossier_bac_history_insert_table
FOR EACH ROW
EXECUTE PROCEDURE sensor_partition();



CREATE OR REPLACE FUNCTION sensor_partition()
RETURNS TRIGGER AS $$
DECLARE
sensor_table TEXT;
new_table TEXT;
new_insert TEXT;
BEGIN
sensor_table='id_bac_'||NEW.id_bac;

               IF NOT EXISTS (SELECT relname FROM pg_class                      
--CHECK IF TABLE 'sensor_table' exists. If not, create the table.
                           WHERE relname=sensor_table) THEN 
                           RAISE NOTICE 'Creating Partition:%', sensor_table;
                           
                           new_table := 'CREATE TABLE '|| sensor_table          
                        --Table does not exists, create table/partition
                                         || ' PARTITION OF 
t_dossier_bac_history_sensor_collections' || ' (id_dossier_bac_history, 
dat_create, dat_supprime, dat_update, num_version, dat_date_entree, 
dat_date_sortie, id_bac, id_dossier, boo_en_migration)'
                                                         || ' FOR VALUES IN ( 
'''|| NEW.id_bac ||''' ) ;';
                                                         
                                                        
                                
                                                         
                           EXECUTE new_table;
                           ELSE
               new_table:= "The table exist already";                           
              --Table already exists, do not create table
               END IF;
                           
                          
                           new_insert := 'INSERT INTO 
t_dossier_bac_history_sensor_collections VALUES('''
                                                        || 
NEW.id_dossier_bac_history ||''', '
                                                        || NEW.boo_supprime 
||', '''
                                                        || NEW.dat_create 
||''','' '
                                                        || NEW.dat_supprime 
||''','' '
                                                        || NEW.dat_update 
||''', '
                                                        || NEW.num_version 
||','' '
                                                        || NEW.dat_date_entree 
||''','' '
                                                    || NEW.dat_date_sortie 
||''','' '
                                                        || NEW.id_bac ||''','' '
                                                        || NEW.id_dossier 
||''', '
                                                        || NEW.boo_en_migration 
||');';
                                        
                                                         --RAISE NOTICE 
'Creating Partition:%', NEW.id_dossier_bac_history;
                          EXECUTE new_insert;
                          -- RETURN NULL;
END;
$$ LANGUAGE plpgsql VOLATILE;


INSERT INTO t_dossier_bac_history_insert_table
SELECT * FROM t_dossier_bac_history;

Reply via email to