- 论坛徽章:
- 0
|
在一个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;
复制代码 |
|