2012-12-25 31 views
3

else條件,我有兩個tables.They是如果在觸發器中的Oracle SQL

CARD(cardid, credit, usertype,charge) 

PAYMENTDEVICE(paydevid, paydevip,paydevdate, paydevtime, chargedcardid, mealtype). 

Mealtype可以是 '客人' 或 '標準'。我想更新卡表中的信用額度,在付款設備中插入新行時。費用取決於使用類型。但如果用餐類型是客人,每個人都必須支付5美元。我嘗試使用下面的代碼

CREATE OR REPLACE TRIGGER "TRG_PAYMONEY" 
AFTER INSERT 
ON PAYMENTDEVICE FOR EACH ROW 

BEGIN 
UPDATE CARD 
WHERE CARDID = :NEW.CHARGEDCARDID 
SET CREDIT = 
(CASE MEALTYPE 

WHEN "STANDARD" THEN CREDIT - CHARGE 
WHEN "GUEST" THEN CREDIT - 5 
END); 
END; 

,但我得到這個錯誤: PL/SQL: ORA-00971: missing SET keyword, PL/SQL: SQL Statement ignored。請問你能幫幫我嗎?

回答

5

按照此語法更新,

update table_name set field1='value' where field2='value' 

(IE)

UPDATE CARD 
SET CREDIT = 
(CASE MEALTYPE 
WHEN "STANDARD" THEN CREDIT - CHARGE 
WHEN "GUEST" THEN CREDIT - 5 
END) 
WHERE CARDID = :NEW.CHARGEDCARDID; 

如需更多信息,如何'update'聲明作品參考此文檔,

http://docs.oracle.com/cd/B19306_01/appdev.102/b14261/update_statement.htm

你的第二個錯誤試試這個,

UPDATE CARD 
SET CREDIT = 
(CASE 
WHEN MEALTYPE="STANDARD" THEN CREDIT - CHARGE 
WHEN MEALTYPE="GUEST" THEN CREDIT - 5 
END MEALTYPE) 
WHERE CARDID = :NEW.CHARGEDCARDID; 

這樣的事情,

update card c 
set c.credit=(select case when p.mealtype='STANDARD' then c.credit-c.charge 
       when p.mealtype='GUEST' then c.credit-5 
      end credit from PAYMENTDEVICE p 
      where c.cardid=p.chargedcardid) 

fiddle_demo

1

你update語句應該是(WHERE後應SET

UPDATE CARD 
SET CREDIT = 
(CASE MEALTYPE 

WHEN "STANDARD" THEN CREDIT - CHARGE 
WHEN "GUEST" THEN CREDIT - 5 
WHERE CARDID = :NEW.CHARGEDCARDID 
0

請運行該代碼..

CREATE OR REPLACE TRIGGER TRG_PAYMONEY1 
AFTER INSERT ON PAYMENTDEVICE 
FOR EACH ROW 
BEGIN 
UPDATE CARD c 
SET c.credit=(select case when p.mealtype='STANDARD' then c.credit-c.charge 
       when p.mealtype='GUEST' then c.credit-5 
      end result from PAYMENTDEVICE p,card c 
      where c.cardid=p.chargedcardid) 
WHERE CARDID = :NEW.CHARGEDCARDID; 
END; 
+0

它仍然給出了錯誤ORA-04091:表SYSTEM.PAYMENTDEVICE正在變異,觸發器/函數可能看不到它ORA-06512:在「SYSTEM.TRG_PAYMONEY1」,第2行ORA-04088:執行觸發器期間出錯'系統.TRG_PAYMONEY1' – user1422167

0

嘛,一個小小的研究,由於Oracle Documentation後我們解決了這個問題的實現:

CREATE OR REPLACE TRIGGER "TRG_PAYMONEY" 
AFTER INSERT 
ON PAYMENTDEVICE FOR EACH ROW 

BEGIN 
IF :NEW.MEALTYPE='GUEST' THEN 
UPDATE CARD 
SET CREDIT = CREDIT - 5 
WHERE CARDID = :NEW.CHARGEDCARDID; 
ELSE 
UPDATE CARD 
SET CREDIT = CREDIT - CHARGE 
WHERE CARDID = :NEW.CHARGEDCARDID; 
END IF; 
END; 

並感謝你的幫助&建議。