3

I have two tables.They are

CARD(cardid, credit, usertype,charge)

and

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

Mealtype can be 'guest' or 'standard'. I want to update credit that is in card table, when a new row is inserted in paymentdevice. Charge depends on usertype. But if meal type is guest, everyone has to pay 5$ . I try to use following code

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;

But i get this error : PL/SQL: ORA-00971: missing SET keyword, PL/SQL: SQL Statement ignored. Could you help me please?

4 Answers 4

5

Follow this syntax for update,

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;

For more, how 'update' statement works refer to this doc,

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

For your second error try this,

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

Something like this,

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

Sign up to request clarification or add additional context in comments.

Comments

1

Your update statement should be (WHERE should be after SET)

UPDATE CARD
SET CREDIT = 
(CASE MEALTYPE

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

Comments

0

please run this code..

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;

1 Comment

It still gives that error ORA-04091: table SYSTEM.PAYMENTDEVICE is mutating, trigger/function may not see it ORA-06512: at "SYSTEM.TRG_PAYMONEY1", line 2 ORA-04088: error during execution of trigger 'SYSTEM.TRG_PAYMONEY1'
0

Well, after a little research and thanks to Oracle Documentation we solved our problem with this implementation :

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;

And thank you for your help & advices.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.