2016-09-20 65 views
2
create table public.orders (
    orderID serial PRIMARY KEY, 
    orderdate timestamp NOT NULL 
); 

create table public.orderdetails (
    orderdetailID serial PRIMARY KEY, 
    orderID integer REFERENCES public.orders(orderID), 
    item varchar(20) NOT NULL, 
    quantity INTEGER NOT NULL 
); 

插入多条记录我有(非常简化的样品)如上述的表,在其中欲插入的顺序和次序的信息的细节在一个动作。Postgres的功能在两个表中

我所熟悉的事务,并可以用SQL命令像下面插入数据:

DO $$ 
    DECLARE inserted_id integer; 
    BEGIN 
    INSERT INTO public.orders(orderdate) VALUES (NOW()) RETURNING orderID INTO inserted_id; 

    INSERT INTO public.orderdetails(orderID, item, quantity) 
    VALUES (inserted_id, 'Red Widget', 10), 
      (inserted_id, 'Blue Widget', 5); 
    END 
$$ LANGUAGE plpgsql; 

然而,理想情况下,我想有这样的一个查询,如果可能的功能之上,而不是被存储在我的应用程序中。

任何人都可以指向正确的方向提供多个记录到postgres函数吗?另外,如果我想要做的事情被认为是不好的做法,请让我知道我应该遵循的其他路线。

在此先感谢。

+0

我真的不明白其点这种关系,为什么需要'orderdetails'表?我会使用一张桌子,并且交易没有问题 – ad4s

+0

HI ad4s, 它是一个简化的例子,订单表中将包含订单日期,出货日期,装运地址等信息,而订单详细信息表包含明细按订单数量逐项逐项。 – Devasta

+0

可能这个可能有助于http://stackoverflow.com/questions/6822460/getting-an-id-inside-a-postgresql-transaction-block – ad4s

回答

4

您可以使用元组数组将多行传递给该函数。你需要一个自定义类型:

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

使用这种类型的数组中函数的参数:

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 $$; 

用法:

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) 
+0

完美的工作,谢谢klin。 :) – Devasta