案例条件不适用于 ORA-01476:除数等于零

Case condition not working for ORA-01476: divisor is equal to zero

我有一个逻辑,像下面这样进行一些计算会给出错误,因为

ORA-01476: divisor is equal to zero

我添加了 CASE 如下条件

V_EFFEC_PER_APPFAIR := (case when v_YEARMSAFORAPPRENT <> then to_char((POWER(1 + (v_YEARMSAFORAPPRENT * 2.5/ 100 / v_YEARMSAFORAPPRENT), v_YEARMSAFORAPPRENT) - 1) * 100, '99990D99' end) as

我哪里错了?

完整代码如下:

v_YEARMSAFORAPPRENT := floor((months_between(to_date(V_BILLSTART_DT), to_date(V_FINALSRDATE, 'dd-mm-yy'))) /12);
V_AMTINMONTH := CAST(to_char(LAST_DAY(V_DATEVARIABLE),'dd') AS INT); 
V_EFFEC_PER_APPFAIR := (case when v_YEARMSAFORAPPRENT <> then to_char((POWER(1 + 
 (v_YEARMSAFORAPPRENT * 2.5/ 100 / v_YEARMSAFORAPPRENT), v_YEARMSAFORAPPRENT) - 1) * 100, 
'99990D99' end) as
 V_APP_FAIR_RENT := (v_FAIR_RENT_AMT * V_EFFEC_PER_APPFAIR) / 100 + v_FAIR_RENT_AMT;
V_APP_FAIR_RENT := V_APP_FAIR_RENT / V_AMTINMONTH;
V_APP_FAIR_RENT := ROUND(V_APP_FAIR_RENT * V_NOOFDAYSINMONTH);
V_EFFEC_PER_APPFAIR := (case when v_YEARMSAFORAPPRENT <> then to_char((POWER(1 + 
 (v_YEARMSAFORAPPRENT * 2.5/ 100 / v_YEARMSAFORAPPRENT), v_YEARMSAFORAPPRENT) - 1) * 100, 
'99990D99' end) as

有多个错误。

  • case when v_YEARMSAFORAPPRENT <> then 是无效语法,因为 <> 运算符的 right-hand 侧没有任何内容。
  • 语句以 as 而不是 ; 语句结束符结束。
  • v_YEARMSAFORAPPRENT * 2.5/ 100 / v_YEARMSAFORAPPRENT 中,您可以取消 v_YEARMSAFORAPPRENT 项并将整个语句简化为 0.025

您还有其他错误,包括:

  • Using TO_DATE on V_BILLSTART_DT and V_FINALSRDATE which, though you have not given the data type, presumably DATE data types and you should 从不对已经是日期的值使用TO_DATE
  • months_between(date1, date2)date1 中减去 date2 而不是相反。我假设您想从最终日期中减去开始日期并以正值结束;不要从开始日期中减去最终日期并以负值结束。

你可能想要这样的东西:

DECLARE
  V_BILLSTART_DT DATE := DATE '2022-01-01';
  V_FINALSRDATE  DATE := DATE '2022-12-31';
  v_YEARMSAFORAPPRENT NUMBER;
  V_EFFEC_PER_APPFAIR VARCHAR2(10);
BEGIN
  v_YEARMSAFORAPPRENT := floor(months_between(V_FINALSRDATE, V_BILLSTART_DT)/12);
  V_EFFEC_PER_APPFAIR  := to_char(
                            (POWER(1.025, v_YEARMSAFORAPPRENT) - 1) * 100, 
                            'fm99990D00'
                          );
  DBMS_OUTPUT.PUT_LINE(V_EFFEC_PER_APPFAIR);
END;
/

注意:我忽略了其他行,因为它们似乎与您陈述的错误消息无关;那些被忽略的行可能有更多错误,但你必须自己调试它们。