Stored procedures Informix中插入触发器的自引用更新

Stored procedures Informix中插入触发器的自引用更新,stored-procedures,triggers,informix,Stored Procedures,Triggers,Informix,我正在将不同来源的数据提取到一个表中。在这个新表中,有一个名为lineno的字段。此字段值应根据公司代码和批号按顺序排列。我编写了以下过程 CREATE PROCEDURE update_line(company CHAR(4), batch CHAR(8), rcptid CHAR(12)); DEFINE lineno INT; SELECT Count(*) INTO lineno FROM tmp_cb_rcpthdr WHERE cbrh_company = company AN

我正在将不同来源的数据提取到一个表中。在这个新表中,有一个名为lineno的字段。此字段值应根据公司代码和批号按顺序排列。我编写了以下过程

CREATE PROCEDURE update_line(company CHAR(4), batch CHAR(8), rcptid CHAR(12));

DEFINE lineno INT;

SELECT Count(*) 
INTO lineno
FROM tmp_cb_rcpthdr
WHERE cbrh_company = company
AND cbrh_batchid = batch;

UPDATE tmp_cb_rcpthdr
SET cbrh_lineno = lineno + 1
WHERE cbrh_company = company
AND cbrh_batchid = batch
AND cbrh_rcptid = rcptid;

END PROCEDURE;
将使用以下触发器调用此过程

CREATE TRIGGER tmp_cb_rcpthdr_ins INSERT ON tmp_cb_rcpthdr 
REFERENCING NEW AS n
FOR EACH ROW
(
    EXECUTE PROCEDURE update_line(n.company, cbrh_batchid, cbrh_rcptid)
);
然而,我得到了以下错误

SQL错误=-747表或列与中引用的对象匹配 触发语句

从oninit.com上,我了解到由触发的SQL语句引起的错误作用于触发表,在本例中,触发表就是UPDATE语句。
所以我的问题是,我如何解决这个问题?有什么解决办法或更好的解决方案吗?

我认为设计需要重新考虑。首先,如果从
tmp\u cb\u rcpthdr
中删除一些行,会发生什么情况?
COUNT(*)
查询将产生重复的
lineno

即使这是一个只有ETL的过程,并且您可以确信数据不会从其他地方被操纵,性能将是一个问题,并且对于任何一个公司和批次id组合,您拥有的数据越多,性能只会变得越差

lineno是否需要从零开始递增,或者只是为了保持原始加载顺序?因为如果是后者,表上的
序列
序列
字段将达到相同的目的,并且效率更高

如果必须以这种方式生成
lineno
,我建议您创建第二个控制表,键入公司和批次id,跟踪当前
lineno
值,即:(未测试)

然后按如下方式使用:

CREATE TRIGGER tmp_cb_rcpthdr_ins INSERT ON tmp_cb_rcpthdr 
REFERENCING NEW AS n
FOR EACH ROW
(
    EXECUTE PROCEDURE update_line(n.company, cbrh_batchid) INTO cbrh_lineno
);

请参阅关于使用计算值和触发器的说明。

谢谢你,我已经应用了你的解决方案,效果非常好。是的,这只是用于ETL过程,它将仅由我手动运行。所以我不担心性能或数据完整性。
CREATE TRIGGER tmp_cb_rcpthdr_ins INSERT ON tmp_cb_rcpthdr 
REFERENCING NEW AS n
FOR EACH ROW
(
    EXECUTE PROCEDURE update_line(n.company, cbrh_batchid) INTO cbrh_lineno
);