3

私は 2 つのテーブルを持っています。

CARD(cardid, credit, usertype,charge)

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

食事の種類は「ゲスト」または「標準」です。paymentdevice に新しい行が挿入されたときに、card テーブルにあるクレジットを更新したいと考えています。料金はユーザータイプによって異なります。ただし、食事タイプがゲストの場合、全員が 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. 私を手伝ってくれますか?

4

4 に答える 4

5

更新するには、この構文に従ってください。

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

(すなわち)

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

2番目のエラーについては、これを試してください。

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

于 2012-12-25T14:47:42.317 に答える
1

更新ステートメントは次のようになります(WHERE後でなければなりませんSET

UPDATE CARD
SET CREDIT = 
(CASE MEALTYPE

WHEN "STANDARD" THEN CREDIT - CHARGE
WHEN "GUEST" THEN CREDIT - 5
WHERE CARDID = :NEW.CHARGEDCARDID
于 2012-12-25T14:47:29.687 に答える
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;

そして、あなたの助けとアドバイスに感謝します。

于 2012-12-26T21:11:04.703 に答える