我有一个从返回嵌套表的函数中拉出的自定义游标。我在游标定义的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。
我不确定问题是什么。它看起来像你的代码正在做它应该做的。你的循环中没有任何东西可以做任何处理,所以它正在启动,获得第一行,然后立即循环并试图获取第二行,这不存在。这是它击中NOTFOUND并引发异常的地方。尝试在其中添加递增变量并使用DBMS_OUTPUT.PUT_LINE('Count ='|| countVar)写出其值。 – gmiley 2014-09-29 18:35:39
你的代码片段不包含任何“显示输出变量”?如何/何时完成? – 2014-09-29 19:05:53
Crystal Reports引擎使用存储过程来提取和显示记录,所以我没有构建代码以便在运行时在屏幕上显示它。到目前为止,代码看起来工作正常,即它将记录返回到Crystal Report引擎,并且它们在Crystal Report中显示。我只注意到1记录存在这个问题,所以有可能代码没有将所有内容都发送回Crystal Reports,我只是能够注意到它。 – rcfmonarch 2014-09-29 19:13:15