我有一个自定义游标,它从一个返回嵌套表的函数中拉出来。我在游标定义的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。
答案 0 :(得分:1)
你没有退出语句来终止你的循环 - 无论你的表函数有多少行,它都会继续读取,直到%notfound。