我想编写一个函数,它将添加插入记录,然后在相关表中插入一个或多个记录。我想我知道在函数内部要做什么,但我不知道函数签名应该是什么样的。
这是一个样机示例:
CREATE TABLE sales(id SERIAL, customer id, sold date);
CREATE TABLE saleitems(SERIAL, sale int, details varchar, price numeric(6,2));
SELECT addSale(42, '2016-01-01',
values ('stuff',13),('more stuff',42),('things',3.14),('etc',0)) items(price,details));
CREATE OR REPLACE FUNCTION addSale(customer,sold,items) RETURNS int AS
$$
-- I think I can handle the rest
$$
LANGUAGE sql;
重点:
VALUES (…) name(…)
构造作为参数 - 这可能吗?items
。这个的适当类型是什么?SQL
,因为我的下一步是将其翻译成其他方言(MySQL和SQL Server)。但是,我会做任何需要的事情。最终,我将代码主体包装在一个事务中,并返回新的sales.id
值。
问题是:以VALUES
形式接受表格表达式的正确参数是什么?
答案 0 :(得分:0)
这里最好的选择是创建一个包含产品详细信息和价格的新类型:
CREATE TYPE product_details AS (
details varchar,
price numeric(6,2)
);
然后,您可以定义类型product_details[]
的函数参数,即产品详细信息的数组。由于您希望拥有一个SQL函数并且需要检索一个插入的串行列的值以便在另一个插入中使用,因此您需要一个CTE:
CREATE FUNCTION addSale(_customer int, _sold int, _items product_details[]) RETURNS int AS
$$
WITH s AS (
INSERT INTO sales (customer, sold) VALUES (_customer, _sold) RETURNING id;
)
INSERT INTO saleitems (sale, details, price)
SELECT s.id, i.d, i.p
FROM s, unnest(_items) i(d, p);
$$ LANGUAGE sql;
然后你就像这样调用函数:
SELECT addSale(42, '2016-01-01'::date,
ARRAY[('stuff',13),('more stuff',42),('things',3.14),('etc',0)]);