1

我有两个简单的(仅用于解释我的问题)表

  1. X 与列(除其他外):IDX、CODE、NUMBER
  2. Y 列(除其他外):CODE、NUMBER、id_fromX

我想(在插入或更新表 X 之后)使用来自 X 的实际记录中的变量更新表 Y。为此,我尝试使用触发器(在表 X 中),如下所示:

SET TERM ^^ ;
CREATE TRIGGER XYZFOR X ACTIVE AFTER INSERT OR UPDATE POSITION 0 AS
begin
  if  (new.CODE is distinct old.CODE)  then
  BEGIN
  EXECUTE STATEMENT ('UPDATE Y SET CODE=:old.CODE, id_fromX=:old.IDX WHERE NUMBER=:old.NUMBER');
  END
end ^^

但我从服务器收到错误:

Execute statement error at jrd8_prepare :\
335544569 : Dynamic SQL Error
335544436 : SQL error code = -104
335544634 : Token unknown - line 1, column 23
335544382 : .
Statement : UPDATE Y SET CODE=:old.CODE, id_fromX=:old.IDX WHERE NUMBER=:old.NUMBER\
Data source : Internal::
At trigger 'XYZ' line: 15, col: 7

如下静态更新:

CREATE TRIGGER XYZ FOR X ACTIVE AFTER INSERT OR UPDATE POSITION 0 AS
begin
if  (new.CODE is distinct from old.CODE)  then
BEGIN
EXECUTE STATEMENT ('UPDATE Y SET CODE=1, id_fromX=111 WHERE NUMBER=1');
END
end ^^
SET TERM ; ^^

完美运行。如何引用 X 表字段来更新表 Y(名称相似的字段)?

4

4 回答 4

5

您使用的是冒号,但旧/新记录不使用它。另外,这里不要使用执行语句,因为 sql 语句是静态的。

将其更改为:

SET TERM ^^ ;
CREATE TRIGGER XYZFOR X ACTIVE AFTER INSERT OR UPDATE POSITION 0 AS
begin
  if  (new.CODE is distinct old.CODE)  then
  BEGIN
    UPDATE Y 
       SET CODE = old.CODE, id_fromX = old.IDX 
     WHERE NUMBER = old.NUMBER;
  END
end ^^
于 2013-01-31T13:51:25.323 回答
2

您不能将参数直接写入语句 with EXECUTE STATEMENT,请参阅文档以获取正确的语法。基本上,它应该类似于

EXECUTE STATEMENT ('UPDATE Y SET CODE = :CODE, id_fromX = :IDX WHERE NUMBER=:NUMBER')
(CODE := old.CODE, IDX := old.IDX, NUMBER := old.NUMBER);

但是您实际上不需要EXECUTE STATEMENT这里,“直接”使用 UPDATE 语句。

于 2013-01-31T13:54:31.250 回答
2

您不能在其中使用触发器上下文变量(old.<column>new.<column>),EXECUTE STATEMENT因为它们是单独的上下文(中的语句EXECUTE STATEMENT看不到它们)。您要么需要使用普通UPDATE语句而不求助于EXECUTE STATEMENT,要么应该传递参数。像:

EXECUTE STATEMENT 
   ('UPDATE Y SET CODE=:code, id_fromX=:idx WHERE NUMBER=:number') 
   (code := old.CODE, idx := old.IDX, number := old.NUMBER);
于 2013-01-31T13:54:45.930 回答
0

:old.CODE 不应该是 old.CODE 吗?

于 2013-01-31T13:46:55.490 回答