在同一个 table of oracle 中通过触发器更新新插入的记录
Update new inserted record through trigger in a same table of oracle
在同一个 table 的 oracle 中通过触发器更新新插入的记录。
-------CODE----------
CREATE OR REPLACE TRIGGER Update_CCID
AFTER INSERT
ON XXAW.XXAW_AR_INV_STG_T_TEST
referencing OLD as old NEW as new
FOR EACH ROW
BEGIN
If :new.Account_Name like '%.VAT%'
then
:new.segment2 := '000';
:new.segment4 := '000';
:new.segment5 := '622';
end if;
END ;
-------------------------------
我遇到以下错误:
[Error] PLS-00103 (8: 29): PLS-00103: Encountered the symbol "LIKE" when expecting one of the following:
not null of nan infinite dangling a empty
请帮助我。
首先,您不能修改 AFTER 触发器中的 :NEW 值 - 应该是 BEFORE。此外,"like" 没有任何问题所以 - 你确定你发布了准确的代码吗?
这是一个例子:
SQL> create table test (account_name varchar2(20), segment2 varchar2(20));
Table created.
SQL> create or replace trigger trg_test
2 after insert on test
3 for each row
4 begin
5 if :new.account_name like '%.VAT%' then
6 :new.segment2 := '000';
7 end if;
8 end;
9 /
create or replace trigger trg_test
*
ERROR at line 1:
ORA-04084: cannot change NEW values for this trigger type
SQL> l2
2* after insert on test
SQL> c/after/before
2* before insert on test
SQL> l
1 create or replace trigger trg_test
2 before insert on test
3 for each row
4 begin
5 if :new.account_name like '%.VAT%' then
6 :new.segment2 := '000';
7 end if;
8* end;
SQL> /
Trigger created.
SQL>
您还可以在创建 table 时使用虚拟列。 segment4
使用替代表达式,因为 table 不能对 2 个虚拟列
使用相同的表达式
create table XXAW.XXAW_AR_INV_STG_T_TEST
(
Account_Name VARCHAR2(10),
segment2 VARCHAR2(10) AS ( CASE WHEN Account_Name like '%.VAT%' THEN '000' END ),
segment4 VARCHAR2(10) AS ( CASE WHEN INSTR(Account_Name,'.VAT') > 0 THEN '000' END ),
segment5 VARCHAR2(10) AS ( CASE WHEN Account_Name like '%.VAT%' THEN '622' END )
);
唯一的缺点是您不能直接在这些列上插入或更新。否则,它会抛出
ORA-54013
和 ORA-54017
在同一个 table 的 oracle 中通过触发器更新新插入的记录。
-------CODE----------
CREATE OR REPLACE TRIGGER Update_CCID
AFTER INSERT
ON XXAW.XXAW_AR_INV_STG_T_TEST
referencing OLD as old NEW as new
FOR EACH ROW
BEGIN
If :new.Account_Name like '%.VAT%'
then
:new.segment2 := '000';
:new.segment4 := '000';
:new.segment5 := '622';
end if;
END ;
-------------------------------
我遇到以下错误:
[Error] PLS-00103 (8: 29): PLS-00103: Encountered the symbol "LIKE" when expecting one of the following:
not null of nan infinite dangling a empty
请帮助我。
首先,您不能修改 AFTER 触发器中的 :NEW 值 - 应该是 BEFORE。此外,"like" 没有任何问题所以 - 你确定你发布了准确的代码吗?
这是一个例子:
SQL> create table test (account_name varchar2(20), segment2 varchar2(20));
Table created.
SQL> create or replace trigger trg_test
2 after insert on test
3 for each row
4 begin
5 if :new.account_name like '%.VAT%' then
6 :new.segment2 := '000';
7 end if;
8 end;
9 /
create or replace trigger trg_test
*
ERROR at line 1:
ORA-04084: cannot change NEW values for this trigger type
SQL> l2
2* after insert on test
SQL> c/after/before
2* before insert on test
SQL> l
1 create or replace trigger trg_test
2 before insert on test
3 for each row
4 begin
5 if :new.account_name like '%.VAT%' then
6 :new.segment2 := '000';
7 end if;
8* end;
SQL> /
Trigger created.
SQL>
您还可以在创建 table 时使用虚拟列。 segment4
使用替代表达式,因为 table 不能对 2 个虚拟列
create table XXAW.XXAW_AR_INV_STG_T_TEST
(
Account_Name VARCHAR2(10),
segment2 VARCHAR2(10) AS ( CASE WHEN Account_Name like '%.VAT%' THEN '000' END ),
segment4 VARCHAR2(10) AS ( CASE WHEN INSTR(Account_Name,'.VAT') > 0 THEN '000' END ),
segment5 VARCHAR2(10) AS ( CASE WHEN Account_Name like '%.VAT%' THEN '622' END )
);
唯一的缺点是您不能直接在这些列上插入或更新。否则,它会抛出
ORA-54013
和 ORA-54017