DB2 触发器哪个更新
Posted
技术标签:
【中文标题】DB2 触发器哪个更新【英文标题】:DB2 trigger which update 【发布时间】:2016-08-05 12:27:01 【问题描述】:我正在尝试使用触发器更新另一个表。这是我的代码:
CREATE TRIGGER REORDER
AFTER UPDATE OF ON_HAND
REFERENCING NEW AS N
FOR EACH ROW
WHEN (N.ON_HAND < 0.1)
BEGIN ATOMIC
UPDATE SRI set SRI.price = SRI.price*10 where SRI.CODE = N.CODE;
END
我收到以下错误:
在“CODE = N.CODE"。预期的标记可能包括:"".. SQLCODE=-104, SQLSTATE=42601, DRIVER=3.68.61
【问题讨论】:
在“CODE = N.CODE”之后发现了一个意外的标记“END-OF-STATEMENT”。预期的标记可能包括:“//
cmets 吗?另外,也许你在更新之后需要;
。
注释不在代码中,我添加了;错误与此分隔符有关
对我 8 月 5 日 answer 的评论将显示 [与 OP 使用的不同的解析器] 如何诊断 8 月 5 日更新的触发源,给出的可能是更清晰的图片问题出在哪里;即错误将在更接近 REFERENCING 子句而不是在 END-OF-STATEMENT 附近被发现。我认为我的简短回答同样清楚,但显然反对投票是其中一些人的一项运动,测试所提供的内容是一种诅咒;根据看到的反馈,我更长的答案迭代地显示了实际看到的效果,作为实际自己执行测试的证明。
【参考方案1】:
以下脚本请求显示了一个设置,然后是两个失败的请求和一个成功的请求;第一个 CREATE TRIGGER 与 OP 中的 [触发器的格式和命名除外] 基本相同,其余两个是其小修改的结果:
设置:
create table on_hand_table (code char, on_hand dec(3, 1) )
; -- Table ON_HAND_TABLE created
create table sri (code char, price dec(7, 2) )
; -- Table SRI created
几个 CREATE TRIGGER 请求;完整的触发器名称用于解释从先前迭代中建立的有效模块,每个请求后面的注释描述了运行 IBM DB2 for i 7.1 的结果:
create trigger ReOrder_source_unchanged
after update of ON_HAND
referencing NEW as N
for each row
when (N.ON_HAND < 0.1 )
begin ATOMIC
UPDATE SRI
set SRI.price = SRI.price*10
WHERE SRI.code = N.code
;
end
-- Keyword REFERENCING not expected. Valid tokens: ON OR.
create trigger ReOrder_OF_Changed_to_ON
after update on ON_HAND
referencing NEW as N
for each row
when (N.ON_HAND < 0.1 )
begin ATOMIC
UPDATE SRI
set SRI.price = SRI.price*10
WHERE SRI.code = N.code
;
end
-- Table ON_HAND not found.
create trigger ReOrder_both_OF_and_ON
after update of ON_HAND
on ON_HAND_TABLE
referencing NEW as N
for each row
when (N.ON_HAND < 0.1 )
begin ATOMIC
UPDATE SRI
set SRI.price = SRI.price*10
WHERE SRI.code = N.code
;
end
-- Trigger REORDER_BOTH_OF_AND_ON created
【讨论】:
【参考方案2】:在 OP 中给出的 CREATE TRIGGER 中似乎缺少 ON table-reference
;只有OF column-name
被编码。这可能是问题的根源,尽管该语法问题被诊断为一个奇怪的位置。?
create trigger ReOrder
after update of ON_HAND /* this names the column being updated */
on ON_HAND_TABLE /* this is missing from OP */
referencing NEW as N
…
【讨论】:
很好,但我认为它仍然需要一个时间。 我无法告诉任何人该怎么想,但我展示的 [作为唯一的变化] 为我创造了一个很好的触发器。手册中的语法甚至显示了WHEN--(--search-condition--)-
,这正是 OP 编码的内容;这大概就是我能够使用原始源代码创建 DB2 TRIGGER 的原因,只需进行我建议的微小更改。以上是关于DB2 触发器哪个更新的主要内容,如果未能解决你的问题,请参考以下文章