案例条件不适用于 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;
/
注意:我忽略了其他行,因为它们似乎与您陈述的错误消息无关;那些被忽略的行可能有更多错误,但你必须自己调试它们。
我有一个逻辑,像下面这样进行一些计算会给出错误,因为
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
onV_BILLSTART_DT
andV_FINALSRDATE
which, though you have not given the data type, presumablyDATE
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;
/
注意:我忽略了其他行,因为它们似乎与您陈述的错误消息无关;那些被忽略的行可能有更多错误,但你必须自己调试它们。