0
点赞
收藏
分享

微信扫一扫

pgsql function 实现动态的拼接sql,网往不同schema插数据

开源分享 2022-03-12 阅读 46

想象一下这个业务场景,你在一张表插入数据,需要将数据分发到不同的schema的表中,此时一个好的方法就是在function中使用execute format拼接sql语句

create or replace function public.vouchertemp() returns trigger as 
$$
declare sche text;
BEGIN
sche:=new.schemaname;--这是此次插入数据的schema,需要将数据insert 到这个schema中
-- if (new.schemaname='user1') then
-- insert into user1.voucher_voucherextrainfo values
-- (new.voucher_id::text,new.physical_location,new.business_purpose,new.note,new.sourced_meta::jsonb,new.extracted_meta::jsonb);
-- end if;
-- if (new.schemaname='user2') then
-- insert into user2.voucher_voucherextrainfo values
-- (new.voucher_id::text,new.physical_location,new.business_purpose,new.note,new.sourced_meta::jsonb,new.extracted_meta::jsonb);
-- end if;

EXECUTE format('insert into %I.voucher_voucherextrainfo(voucher_id_id,physical_location,
			  business_purpose,note,sourced_meta,extracted) values
($1,$2,$3,$4,$5,$6);',sche)USING new.voucher_id::text,new.physical_location,new.business_purpose,new.note,new.sourced_meta::jsonb,new.extracted_meta::jsonb;
return null;
EXCEPTION
WHEN others THEN
RAISE NOTICE '%; STATE: %', SQLERRM, SQLSTATE; 
return null;
END;
$$
language plpgsql;



create trigger vouchertrigger AFTER insert
on public.voucher202203
for each row
execute procedure public.vouchertemp();

--drop trigger vouchertrigger on  voucher202203

insert into voucher202203 values(19,'1','1',1,1,'1','1','1','1','{}','1',1,'1','1','1','1',now(),100,'1',
								10,10,'{}','kpmg','kpmg','kpmg','1','1','1','1','1','{"name":"kpmg"}',
								'{"name":"ell"}',now(),1,now(),'user1')
			
								

voucher202203表如下

-- Table: public.voucher202203

-- DROP TABLE IF EXISTS public.voucher202203;

CREATE TABLE IF NOT EXISTS public.voucher202203
(
    voucher_id bigint NOT NULL,
    voucher_message_digest character varying(40) COLLATE pg_catalog."default",
    original_name character varying(255) COLLATE pg_catalog."default",
    voucher_uploader bigint NOT NULL,
    batch_id integer NOT NULL,
    physical_address character varying(255) COLLATE pg_catalog."default",
    logical_address character varying(255) COLLATE pg_catalog."default" NOT NULL,
    voucher_type_id character(5) COLLATE pg_catalog."default" NOT NULL,
    filelack_flag character varying(32) COLLATE pg_catalog."default" NOT NULL,
    voucher_source text COLLATE pg_catalog."default" NOT NULL,
    file_extension_name character varying(32) COLLATE pg_catalog."default",
    voucher_filesize integer,
    voucher_related_no character varying(32) COLLATE pg_catalog."default",
    voucher_related_type character varying(32) COLLATE pg_catalog."default" NOT NULL,
    voucher_no character varying(32) COLLATE pg_catalog."default",
    account_code character varying(32) COLLATE pg_catalog."default",
    voucher_date timestamp with time zone,
    total_amount numeric,
    currency character(3) COLLATE pg_catalog."default",
    taxable_quantity numeric,
    taxes numeric,
    voucher_related_staff text COLLATE pg_catalog."default" NOT NULL,
    product_name character varying(1024) COLLATE pg_catalog."default",
    supplier_name character varying(64) COLLATE pg_catalog."default",
    client_name character varying(64) COLLATE pg_catalog."default",
    project_name character varying(64) COLLATE pg_catalog."default",
    department_name character varying(64) COLLATE pg_catalog."default",
    physical_location character varying(255) COLLATE pg_catalog."default",
    business_purpose character varying(1024) COLLATE pg_catalog."default",
    note character varying(1024) COLLATE pg_catalog."default",
    sourced_meta text COLLATE pg_catalog."default",
    extracted_meta text COLLATE pg_catalog."default",
    create_time timestamp with time zone NOT NULL,
    last_modified_by integer,
    last_modified_time timestamp with time zone NOT NULL,
    schemaname character(20) COLLATE pg_catalog."default",
    CONSTRAINT voucher202203_pkey PRIMARY KEY (voucher_id)
)

TABLESPACE pg_default;

ALTER TABLE IF EXISTS public.voucher202203
    OWNER to postgres;

-- Trigger: vouchertrigger

-- DROP TRIGGER IF EXISTS vouchertrigger ON public.voucher202203;

CREATE TRIGGER vouchertrigger
    AFTER INSERT
    ON public.voucher202203
    FOR EACH ROW
    EXECUTE FUNCTION public.vouchertemp();

https://stackoverflow.com/questions/14065271/how-to-use-execute-format-using-in-postgres-function

https://stackoverflow.com/questions/54159782/postgresql-same-trigger-function-to-update-on-insert-into-different-tables-usin

举报

相关推荐

0 条评论