如何在oracle中插入触发器之前更改表的旧数据?

时间:2018-04-26 08:35:44

标签: oracle plsql database-trigger

如果将新行插入表中,如果已存在重复行,我想将这两行合并为一行

  

TEST ID列定义为主键

ID     ITEM     QUANTITY
--     ----     --------
1       KA1        5
2       KA2        2

如果使用值(KA1,6)将新行插入表测试,因为项目 KA1 已经存在新行应该插入总数量11和旧行应删除。

结果集应如下所示:

ID     ITEM     QUANTITY
--     ----     --------
2       KA2        2
3       KA1       11
使用触发器和内联程序的

是:

CREATE OR REPLACE TRIGGER  MERG_DUP
BEFORE INSERT ON TEST
FOR EACH ROW
BEGIN
  FOR VAL IN(SELECT ID,ITEM,QUANTITY, FROM TEST)
  LOOP
  IF VAL.ITEM=:NEW.ITEM THEN
            :NEW.QUANTITY:=:NEW.QUANTITY+VAL.QUANTITY;
           XXI_MULTI_PR_REMOVE(VAL.ID);
        EXIT;
  END IF;
  END LOOP;
end; 
/


CREATE  OR REPLACE PROCEDURE XXI_MULTI_PR_REMOVE(ID number)
IS
PRAGMA AUTONOMOUS_TRANSACTION;
L_TID NUMBER;
BEGIN
 L_TID:=ID;
  DELETE FROM  TEST WHERE ID=L_TID;
commit;
END;
/

1 个答案:

答案 0 :(得分:1)

您无需使用PRAGMA AUTONOMOUS_TRANSACTION,也不要在程序中使用COMMIT内联。

对于您的情况, CREATE TABLE test 很好 ID 列定义为 {{ 1}}。

因此,可以使用以下顺序的语句:

number generated always as identity primary key