2016-08-19 14 views
1

挿入レコードを追加し、関連するテーブルに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. 次のステップはこれを他の方言(MySQL & SQL Server)に翻訳することですので、言語をSQLにします。しかし、私は必要なことを何でもします。

最終的にコード本体をトランザクション内にラップし、新しいsales.id値を返します。

問題はVALUESフォームのテーブル式を受け入れるための正しいパラメータは何ですか?

CREATE TYPE product_details AS (
    details varchar, 
    price numeric(6,2) 
); 

は、その後、あなたがタイプproduct_details[]の関数パラメータを定義することができ、製品の詳細情報のすなわち配列:

答えて

0

ここにあなたの最善の策は、製品の詳細と価格を保持している新しいタイプを作成することです。

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; 

そして、あなたはそうのような関数を呼び出す:あなたはSQLの機能を持っているし、別のインサートで使用するための1つのインサートのシリアル列の値を取得する必要がしたいので、あなたは、CTEが必要

SELECT addSale(42, '2016-01-01'::date, 
       ARRAY[('stuff',13),('more stuff',42),('things',3.14),('etc',0)]); 
関連する問題