在一个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;