在同一个 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 ) 

);

Demo

唯一的缺点是您不能直接在这些列上插入或更新。否则,它会抛出 ORA-54013ORA-54017