Oracle
插入後,更新/插入到 pl/sql 觸發器中的另一個表
我正在研究 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
我需要一個觸發器
- 如果標籤在表中再
ABC
插入BRAND_ID=99
一次,TAG
那麼我需要在表count
中增加ABC``2``MY_TAGS
- 如果插入的新值不是
ABC
for99
那麼我需要在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;
就像你不需要任何觸發器一樣,計數總是準確計算的。