Oracle

插入後,更新/插入到 pl/sql 觸發器中的另一個表

  • June 21, 2019

我正在研究 PL/SQL 觸發器我有兩個表

TAG Table

SR.NO    ID    TAG    BRAND_ID  
------  ----  -----  ----------
 1      10    ABC       99


MY_TAGS Table

SR_NO    TAG    COUNT   BRAND_ID  
--------   ---   ------   -------
  1      ABC       1      99

我需要一個觸發器

  1. 如果標籤在表中再ABC插入BRAND_ID=99一次,TAG那麼我需要在表count中增加ABC``2``MY_TAGS
  2. 如果插入的新值不是ABCfor99那麼我需要在MY_TAG表中插入新行

如何使用觸發器處理這種情況。我是 PL /SQL 的新手,任何幫助都會很棒。

我試過這樣,但它總是會執行 Insert 語句(即 else 部分)

CREATE or replace TRIGGER trig1
   AFTER INSERT ON TAG
   REFERENCING NEW AS newRow OLD AS oldRow
   FOR EACH ROW
   WHEN (newRow.ID >=0)
   BEGIN
   IF(:newRow.TAG=:oldRow.TAG AND :newRow.BRAND_ID=:oldRow.BRAND_ID) THEN
      UPDATE MY_TAGS SET COUNT=(select max(counter) from MY_TAG)+1) where brand_id=newRow.BRAND_ID and tag=:newRow.TAG;
   ELSE
      INSERT INTO MY_TAGS VALUES((select max(SR_NO) from MY_TAGS)+1,:newRow.TAG,1,:newRow.BRAND_ID);
   END IF;
   END trig1;

我確實喜歡這個,它現在可以工作了:

CREATE or replace TRIGGER trig1
AFTER INSERT ON TAG
REFERENCING NEW AS newRow OLD AS oldRow
FOR EACH ROW
DECLARE 
rowcnt number;
BEGIN
SELECT COUNT(*) INTO rowcnt FROM MY)TAGS where brand_id=:newRow.COBRAND_ID and 
tag_name=:newRow.TAG_NAME;
   IF(rowcnt=0) THEN 
       INSERT INTO MY_TAGS VALUES((select max(SR_NO) from 
MY_TAGS)+1,:newRow.TAG,1,:newRow.BRAND_ID);
ELSE
    UPDATE MY_TAGS SET COUNT=(select max(count) from MY_TAG)+1) where 
brand_id=newRow.BRAND_ID and tag=:newRow.TAG;
END IF;
END trig1;

my_tags我建議您刪除表並創建一個使用聚合來獲取計數的視圖,而不是具體化計數,這會帶來不一致的風險。

DROP TABLE my_tags;

CREATE VIEW my_tags
AS
SELECT sr_no,
      tag,
      brand_id,
      count(*)
      FROM tag
      GROUP BY sr_no,
               tag,
               brand_id;

就像你不需要任何觸發器一樣,計數總是準確計算的。

引用自:https://dba.stackexchange.com/questions/240189