-1
create or replace TRIGGER TRG_DecreaseQuantity   
AFTER INSERT   
ON V_SALE FOR EACH ROW   
BEGIN     
  UPDATE VEHICLE    
     SET V.V_QUANTITY=(SELECT CASE    
                              WHEN V.V_QUANTITY >= S.QUANTITY AND
                                   V.VEHICLE_ID = S.VEHICLE_ID_FK 
                              THEN V.V_QUANTITY = V.V_QUANTITY-S.QUANTITY    
                              WHEN V.V_QUANTITY < S.QUANTITY 
                              THEN V.V_QUANTITY = S.QUANTITY   
                         FROM VEHICLE V,
                              V_SALE S    
                        WHERE V.VEHICLE_ID=S.VEHICLE_ID_FK
                       )   
   WHERE V.VEHICLE_ID = :NEW.VEHICLE_ID_FK;  
END;   

データベースがautoGalleryあり、その中にテーブルがあります。制御する必要があるV_SALEとの 2 つのテーブルがあります。VEHICLE車両を販売するときは、車両の数を制御してから、数を減らすかどうかを制御したいと考えています。

Vehicle(
   Vehicle_ID Primary key, 
   V_QUANTITY 
   ...
)

V_SALE(
  VEHICLE_ID_FK FOREIGN KEY, 
  QUANTITY 
  ...
)

次のエラーが発生しました。

Compilation failed, line 5 (16:03:48) The line numbers associated with compilation errors are relative to the first BEGIN statement. This only affects the compilation of database triggers.
PL/SQL: ORA-00905: missing keyword
Compilation failed, line 2 (16:03:48) The line numbers associated with compilation errors are relative to the first BEGIN statement. This only affects the compilation of database triggers.
PL/SQL: SQL Statement ignored
4

5 に答える 5

1

適切なCASEステートメントはENDで終了する必要があります。また、比較としても割り当てとしても、THEN句に等号を含めることはできません。

CASE 
    WHEN V.V_QUANTITY >= S.QUANTITY AND V.VEHICLE_ID = S.VEHICLE_ID_FK 
        THEN V.V_QUANTITY - S.QUANTITY 
    WHEN V.V_QUANTITY < S.QUANTITY 
        THEN S.QUANTITY
END
于 2012-12-27T14:20:14.667 に答える
1

次のようなエイリアスを指定してみてください:

UPDATE VEHICLE V    
     SET V.V_QUANTITY=CASE WHEN V.V_QUANTITY >= :NEW.QUANTITY 
                                  THEN V.V_QUANTITY-:NEW.QUANTITY    
                                  WHEN V.V_QUANTITY < :NEW.QUANTITY 
                                  THEN :NEW.QUANTITY   
                              END
   WHERE V.VEHICLE_ID = :NEW.VEHICLE_ID_FK;
于 2012-12-27T15:51:08.273 に答える
0

これを試してください、'CASE WHEN...END'構文が間違っています

create or replace TRIGGER TRG_DecreaseQuantity   
AFTER INSERT   
ON V_SALE FOR EACH ROW   
BEGIN     
      UPDATE VEHICLE    
      SET V.V_QUANTITY=(SELECT    
      CASE    
      WHEN V.V_QUANTITY >=S.QUANTITY AND V.VEHICLE_ID=S.VEHICLE_ID_FK THEN V.V_QUANTITY-S.QUANTITY    
      WHEN V.V_QUANTITY<S.QUANTITY THEN S.QUANTITY END  
      FROM VEHICLE V,V_SALE S    
      WHERE V.VEHICLE_ID=S.VEHICLE_ID_FK)   
      WHERE V.VEHICLE_ID=:NEW.VEHICLE_ID_FK;  
      END;   

IF ELSE Exampleを要求したように、このサンプルサンプルを追加し、必要に応じて適用します。

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-27T14:21:15.900 に答える
0
create or replace TRIGGER "TRG_DecreaseQuantity"
AFTER INSERT
ON V_SALE FOR EACH ROW
BEGIN     
     UPDATE VEHICLE V    
     SET V.V_QUANTITY=CASE WHEN V.V_QUANTITY >= :NEW.QUANTITY 
                                  THEN V.V_QUANTITY-:NEW.QUANTITY    
                                  WHEN V.V_QUANTITY < :NEW.QUANTITY 
                                  THEN V.V_QUANTITY   
                              END
   WHERE V.VEHICLE_ID = :NEW.VEHICLE_ID_FK;
END;
于 2012-12-27T16:23:50.250 に答える
0

これだけでいいんじゃない?

UPDATE VEHICLE V   
     SET V.V_QUANTITY=CASE WHEN V.V_QUANTITY >= :NEW.QUANTITY 
                                  THEN V.V_QUANTITY-:NEW.QUANTITY    
                                  WHEN V.V_QUANTITY < :NEW.QUANTITY 
                                  THEN :NEW.QUANTITY   
                              END
   WHERE V.VEHICLE_ID = :NEW.VEHICLE_ID_FK;  
于 2012-12-27T14:57:12.603 に答える