2016-06-23 24 views
1

私は仕事のテーブルを持っています。私は産業のテーブルを持っています。ジョブと業界は、industriesjobsという結合テーブルを使用して多対多の関係を持っています。どちらの表にも主キーがあります。私の質問は2倍です。まず、このようなデータを挿入する2つの関数を書くことは実現可能ですか?これが実現可能な場合、私の2番目の質問は、どのようにuuid列型の配列を表現するのかということです。私は構文が不明です。多対多のジョインを処理するpostgres関数を書くことはできますか?

CREATE OR REPLACE FUNCTION linkJobToIndustries(jobId uuid, industiresId uuid[]) RETURNS void AS $$ 
DECLARE 
    industryId uuid[]; 
BEGIN 
    FOREACH industryId SLICE 1 IN ARRAY industriesId LOOP 
     INSERT INTO industriesjobs (industry_id, job_id) VALUES (industryId, jobId); 
    END LOOP; 
    RETURN; 
END; 
$$ LANGUAGE plpgsql; 

CREATE OR REPLACE FUNCTION insertJobWithIndistries(orginsation varchar, title varchar, addressId uuid, industryIds uuid[]) RETURNS uuid AS $$ 
DECLARE 
    jobId uuid; 
BEGIN 
    INSERT INTO jobs ("organisation", "title", "address_id") VALUES (orginsation, title, addressId) RETURNING id INTO jobId; 
    SELECT JobbaLinkJobToIndustries(jobId, industryIds); 
END; 
$$ LANGUAGE plpgsql; 

SELECT jobId FROM insertJobWithIndistries(
    'Acme Inc'::varchar, 
    'Bomb Tester'::varchar, 
    '0030cfb3-1a03-4c5a-9afa-6b69376abe2e', 
    { 19c2e0ee-acd5-48b2-9fac-077ad4d49b19, 21f8ffb7-e155-4c8f-acf0-9e991325784, 28c18acd-99ba-46ac-a2dc-59ce952eecf2 } 
); 

ありがとうございます。ソリューションへ

答えて

2

キーunnest()(ドキュメントあたり)に機能している:

は、行

そしてdata-modifying CTEのセットに配列を展開します。

単純なクエリは、仕事をしていません:

WITH ins_job AS (
    INSERT INTO jobs (organisation, title, address_id) 
    SELECT 'Acme Inc', 'Bomb Tester', '0030cfb3-1a03-4c5a-9afa-6b69376abe2e' -- job-data here 
    RETURNING id 
    ) 
INSERT INTO industriesjobs (industry_id, job_id) 
SELECT indid, id 
FROM ins_job i -- that's a single row, so a CROSS JOIN is OK 
    , unnest('{19c2e0ee-acd5-48b2-9fac-077ad4d49b19 
       , 21f8ffb7-e155-4c8f-acf0-9e9913257845 
       , 28c18acd-99ba-46ac-a2dc-59ce952eecf2}'::uuid[]) indid; -- industry IDs here 

uuidの配列のための適切な構文を実証します。 (二重引用符の内側ではないながら要素とセパレータとの間にホワイトスペースは無関係です。)

あなたのUUIDの一つは、1つの文字短くした:
21f8ffb7-e155-4c8f-acf0-9e9913257845 - 1つの以上の文字:
21f8ffb7-e155-4c8f-acf0-9e991325784
のようなものでなければなりません

あなたは機能が必要な場合は、その、あまりにも行います

CREATE OR REPLACE FUNCTION link_job_to_industries(_jobid uuid, _indids uuid[]) 
    RETURNS void AS 
$func$ 
    INSERT INTO industriesjobs (industry_id, job_id) 
    SELECT _indid, _jobid 
    FROM unnest(_indids) _indid; 
$func$ LANGUAGE sql; 

関連:

関連する問題