PL/SQL:ORA-00905:缺少关键字

PL/SQL:ORA-00905:缺少关键字,sql,database,triggers,oracle10g,Sql,Database,Triggers,Oracle10g,我得到了以下错误: Vehicle( Vehicle_ID Primary key, V_QUANTITY ... ) V_SALE( VEHICLE_ID_FK FOREIGN KEY, QUANTITY ... ) 正确的案例陈述必须以结尾结尾。在THEN子句中不能有等号,无论是作为比较还是作为赋值 Compilation failed, line 5 (16:03:48) The line numbers associated with compi

我得到了以下错误:

Vehicle(
   Vehicle_ID Primary key, 
   V_QUANTITY 
   ...
)

V_SALE(
  VEHICLE_ID_FK FOREIGN KEY, 
  QUANTITY 
  ...
)

正确的案例陈述必须以结尾结尾。在THEN子句中不能有等号,无论是作为比较还是作为赋值

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
案例
当V.V_数量>=S.QUANTITY且V.VEHICLE_ID=S.VEHICLE_ID\u FK
然后V.V_数量-S数量
当V.V_数量小于S数量时
然后是美国的数量
结束

试试这个,
“CASE WHEN…END”语法错误

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

你不需要这个吗

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;
更新车辆V
设置V.V_数量=V.V_数量>=时的情况:新建数量
那么V.V_数量-:NEW.QUANTITY
当V.V_数量<:新数量
然后:新的数量
结束
其中V.VEHICLE\u ID=:NEW.VEHICLE\u ID\u FK;

试着给出这样的别名:

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;  
更新车辆V
设置V.V_数量=V.V_数量>=时的情况:新建数量
那么V.V_数量-:NEW.QUANTITY
当V.V_数量<:新数量
然后:新的数量
结束
其中V.VEHICLE\u ID=:NEW.VEHICLE\u ID\u FK;
创建或替换触发器“TRG\u DecreaseQuantity”
插入后
关于每行的V_销售
开始
更新车辆V
设置V.V_数量=V.V_数量>=时的情况:新建数量
那么V.V_数量-:NEW.QUANTITY
当V.V_数量<:新数量
然后是V.V_数量
结束
其中V.VEHICLE\u ID=:NEW.VEHICLE\u ID\u FK;
结束;

这个案例不需要END@Nicholas克拉斯诺夫,谢谢你editing@Mari我仍然会犯这些错误://本,对不起,我没有注意到。现在更正它。你能复习一下吗。感谢..@Mari编译失败,第9行(16:29:59)与编译错误相关联的行号与第一个BEGIN语句相关。PLS-00225:子程序或游标“V”引用超出范围编译失败,第3行(16:29:59)与编译错误相关的行号与第一个BEGIN语句相关。这只会影响数据库触发器的编译。PLS-00225:子程序或游标“V”引用超出范围编译失败,第2行(16:29:59)PL/SQL:ORA-01732:上的数据操纵操作不合法this@notfound90请稍等,我正在调查,我没有发现这个@notfound90有什么问题。select语句运行时没有任何错误吗?是的,您的权利。UPDATE语句的错误比我想象的要多。@Codo我也尝试了这个方法,但它不起作用。“它不起作用”可能意味着:返回错误的结果,运行时出错,编译时出错,炸毁计算机等。你介意更具体一点,告诉exect错误消息吗?@Codo我很抱歉。我收到以下错误:(编译)PL/SQL:ORA-00923:FROM关键字未找到预期PL/SQL:SQL语句被忽略的位置遇到符号“文件结束”应满足以下条件之一时:开始案例声明结束异常退出,如果loop@Codo我无法编写整个错误日志,因为它有点长。我也尝试了这段代码,但得到了错误:子程序或游标“V”引用超出范围。您没有尽力帮助自己@notfound90;将
update vehicle
更改为
update vehicle v
或删除所有
v.
@notfound90添加了别名。非常感谢。这是一项工作。我正在对其进行一些更改。再次感谢:)
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;
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;  
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;
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;