2016-08-19 38 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)]); 
相關問題