在 AS400 中插入时更新触发器
Update Trigger on Insert in AS400
我正在尝试更新 AS400 中当前插入行的字段。我使用的是版本 4.5、5.3 和 7.1。
为了我的测试,我创建了一个包含 CRTDT 字段 (NUMERIC 7,0) 的 table WC(工作中心)
向此 table 插入新记录时,我想检查此字段的值是否小于 200,000,如果是,则添加 1,000,000。
我的 SQL 是:
-- Generate SQL
-- Version: V5R4M0 060210
-- Generated on: 10/13/16 10:03:49
-- Relational Database: S65BEE7B
-- Standards Option: DB2 UDB iSeries
CREATE TRIGGER RAVONLIB.WC_TRIGGER
AFTER INSERT ON RAVONLIB.WC
FOR EACH STATEMENT
MODE DB2SQL
SET OPTION ALWBLK = *ALLREAD ,
ALWCPYDTA = *OPTIMIZE ,
COMMIT = *NONE ,
DECRESULT = (31, 31, 00) ,
DFTRDBCOL = *NONE ,
DYNDFTCOL = *NO ,
DYNUSRPRF = *USER ,
SRTSEQ = *HEX
BEGIN ATOMIC
IF WC.CRTDT<200000 THEN
UPDATE RAVONLIB . WC SET CRTDT = 1000000 + CRTDT ;
END IF;
END ;
我收到一个错误消息,指出变量 CRTDT 未定义或不可用。
如果 CRTDT 小于 200000,正确的语法是什么?
您应该使用 BEFORE INSERT
触发器。
此外,您需要在插入时修改列值...您不能 运行 在触发器中的行中的 SQL UPDATE
语句刚刚插入。
最后,您需要行触发器,而不是语句触发器。
CREATE TRIGGER RAVONLIB.WC_TRIGGER
BEFORE INSERT ON RAVONLIB.WC
REFERENCING NEW AS new_row
FOR EACH ROW MODE DB2ROW
SET OPTION ALWBLK = *ALLREAD ,
ALWCPYDTA = *OPTIMIZE ,
COMMIT = *NONE ,
DECRESULT = (31, 31, 00) ,
DFTRDBCOL = *NONE ,
DYNDFTCOL = *NO ,
DYNUSRPRF = *USER ,
SRTSEQ = *HEX
BEGIN ATOMIC
IF new_row.CRTDT<200000 THEN
SET new_row.CRTDT = 1000000 + new_row.CRTDT ;
END IF;
END ;
FWiW,主要是启蒙,因为这几乎不是 答案 鉴于我对已经 已接受的答案 的评论:在 v5r3 上验证,以下模仿从 OP 到逻辑结论的 语句 触发器;不知道谁会有 v4r5 系统来测试 -- ¡天哪!:
create table wc
( PKfld int not null
, CRTDT numeric(7)
, constraint WC_PK primary key (PKfld)
)
;
CREATE TRIGGER wc_trg_ai
After Insert on WC
REFERENCING NEW TABLE AS xt
FOR EACH STATEMENT MODE DB2SQL
SET OPTION COMMIT = *NONE
BEGIN ATOMIC
update WC set WC.CRTDT = WC.CRTDT + 1000000
where WC.CRTDT<200000
and exists ( select '1' from XT as xt
where xt.PKfld = WC.PKfld ) ;
END
; -- semicolon as statement separator, not end of trigger-body
insert into wc values
( 1, '0000001'), ( 2, '0200000'), ( 3, '0000300')
, ( 4, '0400000'), ( 5, '0050000'), ( 6, '0600000')
; -- per trigger dfn, the even-numbered key values will not see an UPDATE
select * from WC
; -- likeness of report from above query:
PKFLD CRTDT
1 1,000,001
2 200,000
3 1,000,300
4 400,000
5 1,050,000
6 600,000
*** End of data ***
我正在尝试更新 AS400 中当前插入行的字段。我使用的是版本 4.5、5.3 和 7.1。
为了我的测试,我创建了一个包含 CRTDT 字段 (NUMERIC 7,0) 的 table WC(工作中心) 向此 table 插入新记录时,我想检查此字段的值是否小于 200,000,如果是,则添加 1,000,000。
我的 SQL 是:
-- Generate SQL
-- Version: V5R4M0 060210
-- Generated on: 10/13/16 10:03:49
-- Relational Database: S65BEE7B
-- Standards Option: DB2 UDB iSeries
CREATE TRIGGER RAVONLIB.WC_TRIGGER
AFTER INSERT ON RAVONLIB.WC
FOR EACH STATEMENT
MODE DB2SQL
SET OPTION ALWBLK = *ALLREAD ,
ALWCPYDTA = *OPTIMIZE ,
COMMIT = *NONE ,
DECRESULT = (31, 31, 00) ,
DFTRDBCOL = *NONE ,
DYNDFTCOL = *NO ,
DYNUSRPRF = *USER ,
SRTSEQ = *HEX
BEGIN ATOMIC
IF WC.CRTDT<200000 THEN
UPDATE RAVONLIB . WC SET CRTDT = 1000000 + CRTDT ;
END IF;
END ;
我收到一个错误消息,指出变量 CRTDT 未定义或不可用。 如果 CRTDT 小于 200000,正确的语法是什么?
您应该使用 BEFORE INSERT
触发器。
此外,您需要在插入时修改列值...您不能 运行 在触发器中的行中的 SQL UPDATE
语句刚刚插入。
最后,您需要行触发器,而不是语句触发器。
CREATE TRIGGER RAVONLIB.WC_TRIGGER
BEFORE INSERT ON RAVONLIB.WC
REFERENCING NEW AS new_row
FOR EACH ROW MODE DB2ROW
SET OPTION ALWBLK = *ALLREAD ,
ALWCPYDTA = *OPTIMIZE ,
COMMIT = *NONE ,
DECRESULT = (31, 31, 00) ,
DFTRDBCOL = *NONE ,
DYNDFTCOL = *NO ,
DYNUSRPRF = *USER ,
SRTSEQ = *HEX
BEGIN ATOMIC
IF new_row.CRTDT<200000 THEN
SET new_row.CRTDT = 1000000 + new_row.CRTDT ;
END IF;
END ;
FWiW,主要是启蒙,因为这几乎不是 答案 鉴于我对已经 已接受的答案 的评论:在 v5r3 上验证,以下模仿从 OP 到逻辑结论的 语句 触发器;不知道谁会有 v4r5 系统来测试 -- ¡天哪!:
create table wc
( PKfld int not null
, CRTDT numeric(7)
, constraint WC_PK primary key (PKfld)
)
;
CREATE TRIGGER wc_trg_ai
After Insert on WC
REFERENCING NEW TABLE AS xt
FOR EACH STATEMENT MODE DB2SQL
SET OPTION COMMIT = *NONE
BEGIN ATOMIC
update WC set WC.CRTDT = WC.CRTDT + 1000000
where WC.CRTDT<200000
and exists ( select '1' from XT as xt
where xt.PKfld = WC.PKfld ) ;
END
; -- semicolon as statement separator, not end of trigger-body
insert into wc values
( 1, '0000001'), ( 2, '0200000'), ( 3, '0000300')
, ( 4, '0400000'), ( 5, '0050000'), ( 6, '0600000')
; -- per trigger dfn, the even-numbered key values will not see an UPDATE
select * from WC
; -- likeness of report from above query:
PKFLD CRTDT
1 1,000,001
2 200,000
3 1,000,300
4 400,000
5 1,050,000
6 600,000
*** End of data ***