PostgreSQL将对象列表插入存储过程

朱利奥·拉杜(Giulio Ladu)

我目前正在学习PostgreSQL,在存储过程方面碰壁。

我有一个包含这些列的订单表:

OrderId
OrderStatus
OrderTime

我也有一个订单行表

OrderId
OrderLineId
OrderLineAmount
OrderLineCost

我正在尝试编写一个存储过程,该过程将创建一个订单,然后将订单行列表插入第二个表中。

这是我到目前为止的内容:

CREATE OR REPLACE FUNCTION public.createcustomerorder(
_orderstatus integer, 
_ordertimestamp timestamp)
RETURNS int4 AS
$BODY$
  DECLARE 
    last_id int4;
  BEGIN

  INSERT INTO "Order"
    (orderstatus, ordertimestamp)
    VALUES(_orderstatus, _ordertimestamp)
    RETURNING orderid INTO last_id;
RETURN last_id;

END;
$BODY$
LANGUAGE plpgsql;

我发现很难弄清楚如何传递参数,然后进行实际插入。

谢谢你的时间

阿贝里斯托

有几种方法可以将记录列表传递给函数。

使用简单表作为示例,您可以将其调整为适合您的模式:

create table t(id serial primary key, x int, y text);

JSON格式

create function foo_j(data JSON) returns void language plpgsql as $$
begin
  insert into t(x, y)
  select (d->>'x')::int, (d->>'y')::text
  from json_array_elements(data) as d;
  return;
end $$;

用法:

select foo_j('[{"x": 1, "y": "a"}, {"x": 2, "y": "b"}]');

数组

要使用数组,您需要声明其元素的类型。它将包含表的变量字段,在我们的示例中,除id以外的所有字段:

create type t_data as (x int, y text);

create function foo_a(data t_data[]) returns void language plpgsql as $$
begin
  insert into t(x, y)
  select d.x, d.y
  from unnest(data) as d;
  return;
end $$;

用法:

select foo_a(array[(1, 'a'), (2, 'b')]::t_data[]);

可变参数

函数声明及其调用几乎相同,但有所不同:

create function foo_v(variadic data t_data[]) returns void language plpgsql as $$
begin
  insert into t(x, y)
  select d.x, d.y
  from unnest(data) as d;
  return;
end $$;

用法:

select foo_v((1, 'a'), (2, 'b'));

说明文件:

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章