CREATE OR REPLACE FUNCTION F_DJL
(
P_KFDW VARCHAR2,
P_ND VARCHAR2,
p_KSYD NUMBER,
p_ZZYD NUMBER)RETURN VARCHAR2
IS
V_HGFW VARCHAR(6);--回归范围
V_1 NUMBER;--∑[Xi*ln(Yi)]
V_2 NUMBER;--∑Xi
V_3 NUMBER;--∑ln(Yi)
V_4 NUMBER;--∑Xi^2
V_A NUMBER;
V_B NUMBER;
V_R NUMBER;--R^2=V_SSR/(V_SSR+V_SSE)
V_R1 NUMBER;
V_SSR NUMBER;
V_SSE NUMBER;
V_LNY NUMBER;
V_KSNY VARCHAR2(6);
V_ZZNY VARCHAR2(6);
V_X NUMBER;
V_Y NUMBER;
CURSOR RS IS
SELECT TO_NUMBER(SUBSTR(NY,5,2)) ,ZRSP FROM AYC01
where NY>=V_KSNY AND NY<=V_ZZNY AND AYC01.Kfdy=P_KFDW AND ZRSP IS NOT NULL;
BEGIN
V_1:=0;
V_2:=0;
V_3:=0;
V_4:=0;
V_SSR:=0;
V_SSE:=0;
V_R1:=0;
V_R:=0;
V_HGFW:=p_KSYD||'-'||p_ZZYD;--回归范围,如1-7
IF P_KSYD<9 THEN
V_KSNY:=P_ND||'0'||P_KSYD ;
ELSE
V_KSNY:=P_ND||P_KSYD ;
END IF;
IF P_ZZYD<9 THEN
V_ZZNY:=P_ND||'0'||P_ZZYD;
ELSE
V_ZZNY:=P_ND||P_ZZYD;
END IF;
IF F_GETROWS('SELECT COUNT(*) FROM AYC01 where NY>='||V_KSNY||' AND NY<='||V_ZZNY||
' AND AYC01.Kfdy='''||P_KFDW||''' AND ZRSP IS NOT NULL')>0 THEN
--计算A、B的值
OPEN RS;
FETCH RS INTO V_X,V_Y ;
WHILE RS%FOUND LOOP
BEGIN
V_1:=V_1 + V_X * LN(V_Y);
V_2:=V_2 + V_X ;
V_3:=V_3 + LN(V_Y);
V_4:=V_4 + V_X * V_X;
END;
FETCH RS INTO V_X,V_Y;
END LOOP;
IF (V_4 - (V_2 * V_2)) <>0 THEN
V_B:=(V_1- (V_2 * V_3)/RS%ROWCOUNT)/(V_4 - (V_2 * V_2)/RS%ROWCOUNT);
V_A:=EXP(V_3/RS%ROWCOUNT - V_B*V_2/RS%ROWCOUNT);
V_LNY:=V_3/RS%ROWCOUNT;
ELSE
INSERT INTO AYC07(RQ,XH,SFMC,BM,DW,SM)
VALUES(SYSDATE,'2','INSERT_AYC02','AYC02',P_KFDW,P_ND||'年'||V_HGFW||'月,计算递减率时,分母为零。。');
COMMIT;
END IF;
CLOSE RS ;
OPEN RS;
FETCH RS INTO V_X,V_Y ;
WHILE RS%FOUND LOOP
BEGIN
V_R1:=LN(V_A) + V_B * V_X;
V_SSR:=V_SSR + (V_R1 - V_LNY) *(V_R1 - V_LNY);
V_SSE:= V_SSE + (LN(V_Y) - V_R1 )* (LN(V_Y) - V_R1 ) ;
END;
FETCH RS INTO V_X,V_Y;
END LOOP;
IF V_SSR+V_SSE<>0 THEN
V_R:=SQRT(V_SSR/(V_SSR+V_SSE));
END IF;
IF V_R<>0 AND V_A<>0 AND V_B<>0 THEN
return '1';
ESLE
return '0';
END IF;
END IF;
END;