我目前正在学习 PostgreSQL 并且在涉及存储过程时遇到了障碍。
我有一个包含这些列的订单表:
OrderId
OrderStatus
OrderTime
Run Code Online (Sandbox Code Playgroud)
我也有一个订单行表
OrderId
OrderLineId
OrderLineAmount
OrderLineCost
Run Code Online (Sandbox Code Playgroud)
我正在尝试编写一个存储过程,该过程将创建一个订单,然后将一个订单行列表插入到第二个表中。
这是我到目前为止所拥有的:
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;
Run Code Online (Sandbox Code Playgroud)
我发现很难弄清楚如何传递参数,然后如何进行实际插入。
谢谢你的时间
有几种方法可以将记录列表传递给函数。
使用简单表作为示例,您可以使其适应您的架构:
create table t(id serial primary key, x int, y text);
Run Code Online (Sandbox Code Playgroud)
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 $$;
Run Code Online (Sandbox Code Playgroud)
用法:
select foo_j('[{"x": 1, "y": "a"}, {"x": 2, "y": "b"}]');
Run Code Online (Sandbox Code Playgroud)
大批
要使用数组,您需要为其元素声明类型。它将包含表的变量字段,在我们的示例中,除了 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 $$;
Run Code Online (Sandbox Code Playgroud)
用法:
select foo_a(array[(1, 'a'), (2, 'b')]::t_data[]);
Run Code Online (Sandbox Code Playgroud)
可变参数
几乎相同但在函数声明及其调用方面有所不同:
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 $$;
Run Code Online (Sandbox Code Playgroud)
用法:
select foo_v((1, 'a'), (2, 'b'));
Run Code Online (Sandbox Code Playgroud)
文档:
| 归档时间: |
|
| 查看次数: |
2429 次 |
| 最近记录: |