免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2698 | 回复: 0
打印 上一主题 下一主题

请问一下一个语句为什么会进入死循环 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-06-05 18:53 |只看该作者 |倒序浏览
在一个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函数具体代码如下:
  1. create or replace function GetQVSPinCode(V_ADA       in NUMBER,
  2.                                          V_GRADING_D IN NUMBER) return CHAR as
  3.   /*
  4.    * 获取QVS审核职级
  5.    * Author: cobe
  6.    * Date:   20110526
  7.   */

  8.   V_PIN CHAR(1);

  9.   --存放上一年度信息
  10.   V_YEAR1    NUMBER(4);
  11.   V_PIN1     CHAR(1);
  12.   V_GRADING1 NUMBER(2);
  13.   --存放本年度信息
  14.   V_YEAR2    NUMBER(4);
  15.   V_PIN2     CHAR(1);
  16.   V_GRADING2 NUMBER(2);

  17.   V_CNT NUMBER(1);

  18.   TYPE rc IS REF CURSOR; --定义游标类型
  19.   cur rc; --定义游标变量

  20. begin
  21.   V_PIN := NULL;
  22.   V_CNT := 0;

  23.   --查询最新两年数据
  24.   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'
  25.     USING V_ADA;
  26.   LOOP
  27.     FETCH cur
  28.       INTO V_YEAR1, V_PIN1, V_GRADING1;
  29.     EXIT WHEN cur%NOTFOUND;
  30.   
  31.     --若为第一条记录,则为最新年度信息,赋值到变量2中  
  32.     V_CNT := V_CNT + 1;
  33.     IF V_CNT = 1 THEN
  34.       V_YEAR2    := V_YEAR1;
  35.       V_PIN2     := V_PIN1;
  36.       V_GRADING2 := V_GRADING1;
  37.     END IF;
  38.   END LOOP;
  39.   CLOSE CUR;

  40.   IF V_CNT = 1 THEN
  41.     V_PIN := V_PIN2;
  42.   ELSIF V_CNT = 2 THEN
  43.     --若上一年职级为高级主任或以上,则取去年与今年较大职级
  44.     IF V_GRADING1 >= V_GRADING_D AND V_GRADING1 > V_GRADING2 THEN
  45.       V_PIN := V_PIN1;
  46.     ELSE
  47.       --否则取今年职级
  48.       V_PIN := V_PIN2;
  49.     END IF;
  50.   END IF;

  51.   return V_PIN;
  52. exception
  53.   when others then
  54.     return null;
  55. end;
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP