PostgreSQL:创建一个接受多个值的函数

时间:2016-08-19 03:04:14

标签: postgresql function types parameters

我想编写一个函数,它将添加插入记录,然后在相关表中插入一个或多个记录。我想我知道在函数内部要做什么,但我不知道函数签名应该是什么样的。

这是一个样机示例:

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;

重点:

  1. 我希望能够使用VALUES (…) name(…)构造作为参数 - 这可能吗?
  2. 我认为真正的问题是最后一个参数items。这个的适当类型是什么?
  3. 我希望语言为SQL,因为我的下一步是将其翻译成其他方言(MySQL和SQL Server)。但是,我会做任何需要的事情。
  4. 最终,我将代码主体包装在一个事务中,并返回新的sales.id值。

    问题是:以VALUES形式接受表格表达式的正确参数是什么?

1 个答案:

答案 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)]);