2016-08-19 65 views
1

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

这里是一个样机样品:

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)。不过,我会做任何需要的。

最终我将包裹在一个事务中的代码体,并返回新的sales.id值。

问题是:在VALUES表单中接受表格表达的正确参数是什么?

回答

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)]); 
相关问题