2017-06-13 237 views
0

我有两列表permit_table与列构建器和permit_number weekly_table与列申请人和permit_number。 现在,如果在permit_table的builder列中有任何更新,我需要更新weekly_table的申请者列,其中'old申请人值+新建造者值',如果来自permit_table的更新的建造者值的许可证编号应该与任何许可证编号在weekly_table中。 我曾与下面的触发尝试和功能在postgresql更新触发器后更新从一个表格到另一个表格的值

CREATE OR REPLACE FUNCTION edmonton.automated_builder_update_trigger_manual() 
RETURNS trigger AS 
$BODY$ 
DECLARE 
    e record; 
BEGIN 

EXECUTE format('Update weekly_table as a 
set applicant = old.applicant||new.builder where old.permit_number = 
a.permit_number'); 


RETURN NULL; 
END; 
$BODY$ 
LANGUAGE plpgsql VOLATILE 
COST 100; 
ALTER FUNCTION edmonton.automated_builder_update_trigger_manual() 
OWNER TO postgres; 

和触发是

CREATE TRIGGER builder_update_trigger_manual 
AFTER UPDATE 
ON edmonton.permit_table 
FOR EACH ROW 
WHEN (old.builder IS DISTINCT FROM new.builder) 
EXECUTE PROCEDURE edmonton.automated_builder_update_trigger_manual(); 

我得到错误“FROM子句中缺少的条目表‘老’。

+1

直接写更新的函数体有OLD *和新*进行插值处理。与将查询传递给不需要插值的'EXECUTE'相反,这与您需要的内容相反,以及为什么SQL查找“old”作为真正的表。 –

+0

谢谢你的工作。 –

回答

0
EXECUTE format('Update weekly_table as a 
set applicant = old.applicant||new.builder where old.permit_number = 
a.permit_number'); 

尝试更改为:

EXECUTE format('Update weekly_table as a 
set applicant = ($1).applicant||($2).builder where ($1).permit_number = 
a.permit_number') using old,new; 
+0

感谢您的回复。我试过这个。它提出了一个错误'COLUMN申请人没有在数据类型permit_table中找到。因为申请人字段将在weekly_table中可用,而不是在permit_table.Any方式来解决这个问题? –

+0

和丹尼尔斯的建议 - 直接写更新声明?应该做的伎俩 –

相关问题