oracle表中数据死循环,请问一下一个语句为什么会进入死循环

在一个forall的语句中:

OPEN CUR_MEMBER_EXT_TMP;

LOOP

BEGIN

FETCH CUR_MEMBER_EXT_TMP BULK COLLECT

INTO V_ADA_ARRAY, V_DTE1_ARRAY, V_DTE2_ARRAY, V_DTE3_ARRAY, V_NUM1_ARRAY, V_NUM2_ARRAY, V_C1_ARRAY, V_C2_ARRAY LIMIT V_LIMIT_NUMBERS;

IF V_ADA_ARRAY.COUNT = 0 THEN

EXIT;

END IF;

FORALL i in V_ADA_ARRAY.FIRST .. V_ADA_ARRAY.LAST

UPDATE MEMBER

SET PIN_LVL_AFT_APR = GetQVSPinCode(V_ADA_ARRAY(i), V_GRADING_D);

COMMIT;

END;

END LOOP;

CLOSE CUR_MEMBER_EXT_TMP;

运行到update的部分,引用了一个函数GetQVSPinCode

我用plsql调试的时候,不断在这个函数中执行,而且传入的参数都是V_ADA_ARRAY(i)的第一个值,i的值没有增加,调试的过程就是不断在函数里面传入同一个值V_ADA_ARRAY(1),,return自然也是一样的。

我看了很久,都想不到为什么i不会增加,而且函数GetQVSPinCode为什么不退出来。恳请各位指点一下,谢谢。

GetQVSPinCode函数具体代码如下:

create or replace function GetQVSPinCode(V_ADA       in NUMBER,

V_GRADING_D IN NUMBER) return CHAR as

/*

* 获取QVS审核职级

* Author: cobe

* Date:   20110526

*/

V_PIN CHAR(1);

--存放上一年度信息

V_YEAR1    NUMBER(4);

V_PIN1     CHAR(1);

V_GRADING1 NUMBER(2);

--存放本年度信息

V_YEAR2    NUMBER(4);

V_PIN2     CHAR(1);

V_GRADING2 NUMBER(2);

V_CNT NUMBER(1);

TYPE rc IS REF CURSOR; --定义游标类型

cur rc; --定义游标变量

begin

V_PIN := NULL;

V_CNT := 0;

--查询最新两年数据

OPEN CUR FOR 'SELECT A.FIS_YEAR,A.PIN,B.PIN_GRADING FROM (SELECT ADA, FIS_YEAR, PIN, ROWNUM IROW FROM QVS_AUDIT_DTL WHERE ADA=:ADA ORDER BY FIS_YEAR DESC) A,PIN_TABLE B WHERE A.IROW<3 AND A.PIN=B.PIN_CDE'

USING V_ADA;

LOOP

FETCH cur

INTO V_YEAR1, V_PIN1, V_GRADING1;

EXIT WHEN cur%NOTFOUND;

--若为第一条记录,则为最新年度信息,赋值到变量2中

V_CNT := V_CNT + 1;

IF V_CNT = 1 THEN

V_YEAR2    := V_YEAR1;

V_PIN2     := V_PIN1;

V_GRADING2 := V_GRADING1;

END IF;

END LOOP;

CLOSE CUR;

IF V_CNT = 1 THEN

V_PIN := V_PIN2;

ELSIF V_CNT = 2 THEN

--若上一年职级为高级主任或以上,则取去年与今年较大职级

IF V_GRADING1 >= V_GRADING_D AND V_GRADING1 > V_GRADING2 THEN

V_PIN := V_PIN1;

ELSE

--否则取今年职级

V_PIN := V_PIN2;

END IF;

END IF;

return V_PIN;

exception

when others then

return null;

end;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值