Postgres Function to insert multiple records in two tables Postgres Function to insert multiple records in two tables database database

Postgres Function to insert multiple records in two tables


You can use an array of tuples to pass multiple rows to the function. You need a custom type:

create type order_input as (    item text,    quantity integer);

Use array of this type for an argument of the function:

create or replace function insert_into_orders(order_input[])returns void language plpgsql as $$declare     inserted_id integer;begin    insert into public.orders(orderdate)     values (now())     returning orderid into inserted_id;    insert into public.orderdetails(orderid, item, quantity)    select inserted_id, item, quantity    from unnest($1);end $$;

Usage:

select insert_into_orders(    array[        ('Red Widget', 10),         ('Blue Widget', 5)    ]::order_input[]);select * from orderdetails; orderdetailid | orderid |    item     | quantity ---------------+---------+-------------+----------             1 |       1 | Red Widget  |       10             2 |       1 | Blue Widget |        5(2 rows)


Thanks Klin. That helped a lot.

Further, I was able to avoid the usage of an explicit type and just having used the table defined as an array.

Code below:

-- Create table whose type will be passed as input parametercreate table tbl_card(id integer,name varchar(10),cardno bigint)-- Create function to accept an array of tablecreate or replace function fn_insert_card_arr (tbl_card[]) returns integer as $$begininsert into tbl_card (id, name,cardno)select id, name, cardnofrom unnest($1);return 0;end;$$ LANGUAGE plpgsql;-- Execute function by passing an array of table (type casted to array of type table)select fn_insert_card_arr(array[    (1,'one', 2222777744448888),     (2,'two', 8888444466662222),    (3,'three', 2222777744448888),     (4,'four', 8888444466662222)]::tbl_card[]);