2016-04-26 54 views
1

我试图根据一个人插入到另一个表中插入值到表中。我有一个触发器,当有人被分配到员工时,他们被自动分配到employeepark,并有第一个可用的位置。我无法弄清楚如何访问输入到employee表中的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); 

帕特里克想通了这一点对我来说,现在我遇到了这个问题: 我要选择的第一个值的所有这些范围是空的,我把虽然找回一个它只是绕过范围并直接进入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是另一个表,当我运行选择查询,我得到下一个可用的停车位(我只是尝试了)..即时通讯错误,因为插入语句中的new.employeeid没有访问刚刚输入到员工中的值@Patrick – Zeke

+1

问题在触发器定义中应该是'FOR EACH ROW'。查看更新的答案。 – Patrick

+0

我需要返回这些范围内的第一个值,这将是600,但我不断收到一个..它忽略范围...任何提示? @Patrick – Zeke