2014-09-29 54 views
-1

我有一个从返回嵌套表的函数中拉出的自定义游标。我在游标定义的SQL中使用TABLE函数(DDS_COMPILE)来提取数据。我已经建立了一个简单的检查,将FETCH记录拉到Record DataType对象(也可以自定义匹配),如果找不到数据(如果使用%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; 

有更多的程序,当然,这不是与此相关的问题。最有可能的是,最后的循环不能按预期工作。任何人有任何想法?

在此先感谢您的帮助! :)


UPDATE:

我已经尝试了一些建议,改变了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。

+0

我不确定问题是什么。它看起来像你的代码正在做它应该做的。你的循环中没有任何东西可以做任何处理,所以它正在启动,获得第一行,然后立即循环并试图获取第二行,这不存在。这是它击中NOTFOUND并引发异常的地方。尝试在其中添加递增变量并使用DBMS_OUTPUT.PUT_LINE('Count ='|| countVar)写出其值。 – gmiley 2014-09-29 18:35:39

+0

你的代码片段不包含任何“显示输出变量”?如何/何时完成? – 2014-09-29 19:05:53

+0

Crystal Reports引擎使用存储过程来提取和显示记录,所以我没有构建代码以便在运行时在屏幕上显示它。到目前为止,代码看起来工作正常,即它将记录返回到Crystal Report引擎,并且它们在Crystal Report中显示。我只注意到1记录存在这个问题,所以有可能代码没有将所有内容都发送回Crystal Reports,我只是能够注意到它。 – rcfmonarch 2014-09-29 19:13:15

回答

1

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

+0

那么,是不是说它会一直返回No_Data异常?它并没有。它会在大多数时间返回记录(尽管可能有1个失踪)。 – rcfmonarch 2014-09-29 18:41:24

+0

我不明白这是怎么可能的 - 除非你的代码段遗漏了LOOP和END LOOP之间的一些代码? – 2014-09-29 18:49:57

+0

我同意......现在很奇怪你提出这个问题。原来没有代码丢失。 – rcfmonarch 2014-09-29 18:53:36