从光标检查记录计数

时间:2014-09-29 18:27:38

标签: oracle plsql oracle11g

我有一个自定义游标,它从一个返回嵌套表的函数中拉出来。我在游标定义的SQL中使用TABLE函数(DDS_COMPILE)来提取数据。在将FETCH记录拉到记录数据类型对象(也是自定义匹配)后,我已经构建了一个简单的检查,如果没有使用%NOTFOUND找到的数据,则应该引发异常。

当我为一组给定的输入参数(即STORE X,对于CLASS Y)运行例程时,代码返回1条记录。我可以看到记录,如果我运行自己查询数据库的函数,只有当我的FETCH语句被注释掉时才会显示记录。如果取消注释FETCH,则会抛出NoData异常。那我的FETCH有什么问题?

以下是代码片段:

          OPEN DataReturn FOR
           SELECT 
                     DDSRecs.OrgID
                     , DDSRecs.DistrictCode
                     , DDSRecs.DistrictName
                     , DDSRecs.StoreNumber
                     , DDSRecs.StoreName
                     , DDSRecs.AssociateLastName
                     , DDSRecs.AssociateFirstName
                     , DDSRecs.AssociateMiddleName
                     , DDSRecs.AssociateLDAP
                     , DDSRecs.AssociateUID
                     , DDSRecs.AssociateDeptName
                     , DDSRecs.DeptHeadCount
                     , DDSRecs.JobCode
                     , DDSRecs.ActSourceableStatus
                     , DDSRecs.CertTargetDate
                     , DDSRecs.CertName
                     , DDSRecs.CertExpiredOn
                     , DDSRecs.CertRevokedOn
                     , DDSRecs.CertRecertStartsOn
                     , DDSRecs.CourseNumber
                     , DDSRecs.CourseNumberName
                     , DDSRecs.CourseHours
                     , DDSRecs.RegID
                     , DDSRecs.CourseStatus
                     , DDSRecs.CourseActionStatus
                     , DDSRecs.CourseTargetDate
                     , DDSRecs.CourseCompletionDate
                     , DDSRecs.CourseDenseRank
                     , DDSRecs.DueDateStatus
                     , DDSRecs.DueDate
                     , DDSRecs.RegAction
                     , DDSRecs.DeliveryMode
                     , DDSRecs.MMUFlag
                     , DDSRecs.ErrorMessage
                FROM TABLE(HDT_CORE_MAIN.DDS_COMPILE(
                          FinalOrgID
                          , ParamReportType
                          , ParamCourseNumberCheck
                          , ParamNameKeywordCheck
                     )) DDSRecs
           ;
      LOOP
           FETCH DataReturn INTO DDS_ERR_CHECK;
           IF DataReturn%NOTFOUND THEN 
                RAISE DDS_ERR_NO_DATA;
           END IF;
      END LOOP;
      CLOSE DataReturn; 

当然,程序还有很多与此问题无关的问题。从根本上说,它是最终的循环,并没有按预期工作。有人有任何想法吗?

提前感谢您的帮助! :)


更新

我已经尝试了一些建议并将FETCH LOOP更改为以下内容:

          LOOP
           x := x + 1;
           FETCH DataReturn INTO DDS_ERR_CHECK;
           IF DataReturn%FOUND THEN
                DBMS_OUTPUT.PUT_LINE('x = ' || x);
                EXIT;
           ELSE                    
                RAISE DDS_ERR_NO_DATA;
           END IF;
          END LOOP;

这会看到1条记录(因为它不会抛出异常),但1条记录不会显示在输出变量中。请注意,X确实按预期增加到1。

1 个答案:

答案 0 :(得分:1)

你没有退出语句来终止你的循环 - 无论你的表函数有多少行,它都会继续读取,直到%notfound。