2016-04-26 15 views
1

別のテーブルに人が挿入されたことに基づいてテーブルに値を挿入しようとしています。私は誰かが従業員に割り当てられているときに、これをトリガーにして、自動的に利用可能な最初のスポットでeeparkに割り当てられます。私は従業員テーブルに入力されているIDにアクセスする方法を理解できません。私は任意のヒントやアイデアをありがとう、ありがとう!ストアドプロシージャ、ちょうど挿入されたデータにアクセスする

これは私が受け取っているエラーです。

ERROR: record "new" is not assigned yet 
 
create or replace function new_employeeAssign() returns trigger as $new_employeeAssign$ 
declare 
    open_spotID int := (select parkingspot.spotid 
         from employeepark e full outer join parkingspot on e.spotid = parkingspot.spotid 
         where e.spotid isNull limit 1); 
begin 
    insert into employeepark(employeeid, spotid) 
     values(new.employeeid ,open_spotID); 
End; 
$new_employeeAssign$ language plpgsql; 

create trigger new_employeeAssign after insert on employee 
    execute procedure new_employeeAssign(); 

insert into people(peopleid, fname, lname) 
    values(686, 'random', 'person'); 
insert into employee(employeeid) 
    values(686); 

パトリックは今、私はにこの問題を実行しています私のためにこれを考え出した: 私はnullであるこれらの範囲の全てのうち最初の値を選択したい、私も1を取り戻す保ちます範囲をバイパスしてisNullにまっすぐ進んでいます。

 
    (select parkingspot.spotid 
    from employeepark e full outer join parkingspot on e.spotid =  parkingspot.spotid 
    where (e.spotid = 301) 
    or (e.spotid = 1601) 
    or (e.spotid = 2001) 
    or (e.spotid = 2011) 
    or (e.spotid = 2121) 
    or (e.spotid = 2021) 
    or (e.spotid = 2771) 
    or (e.spotid = 2921) 
    or (e.spotid = 3021) 
    or (e.spotid = 3823) isNull 
    limit 1) 

答えて

2

トリガーの定義が正しくありません。デフォルトでは、トリガーはFOR EACH STATEMENTに適用され、NEWパラメーターは存在しません(トリガーは行に適用されません)。代わりに、あなたは持っている必要があります。

CREATE TRIGGER new_employeeAssign AFTER INSERT ON employee 
FOR EACH ROW EXECUTE PROCEDURE new_employeeAssign(); 

いくつかの問題は、変数open_spotIDに割り当てるクエリは特に、あなたのトリガ機能でもあります。このクエリはNULLを選択します。これはe.spotid IS NULLで、あなたはe.spotid = parkingspot.spotidに参加します。探しているロジックは、テーブルemployeeparkの行をspot_idで他の従業員に割り当てていない行を新しい従業員に割り当てることです。以下のコードを参照してください。

また、関数からRETURN NEWにする必要があります。

それ以外

、あなたのトリガ機能は非常にそうように最適化することができます:私は選択クエリは、私は(私はちょうどそれを試してみました)次の利用可能な駐車場を取得することを実行したときに

CREATE FUNCTION new_employeeAssign() RETURNS trigger AS $new_employeeAssign$ 
BEGIN 
    INSERT INTO employeepark(employeeid, spotid) 
     SELECT NEW.employeeid, spotid 
     FROM parkingspot p 
     LEFT JOIN employeepark e USING (spotid) 
     WHERE e.employeeid IS NULL 
     LIMIT 1; 
    RETURN NEW; 
END; 
$new_employeeAssign$ LANGUAGE plpgsql; 
+0

parkingspotは、別のテーブル..ですinsert文のnew.employeeidがemployee @Patrickに入力されたばかりの値にアクセスしていないためにエラーが発生しました – Zeke

+1

問題はトリガ定義にあります。これは 'FOR EACH ROW'にする必要があります。更新された回答をご覧ください。 – Patrick

+0

私はこれらの範囲で最初の値を返す必要があります。これは600になるnullですが、私は1を取得し続けます..範囲を無視しています...ヒント? @Patrick – Zeke

関連する問題