【发布时间】:2021-06-04 18:58:50
【问题描述】:
我在 oracle 数据库中创建了一个过程,该过程在引用游标中返回数据,并且我希望它也将这个游标的行数作为输出变量返回。经测试,P_count 变量填写正确,但是当我试图打开它时
ORA-01002: fetch out of sequence
错误被触发。我以前读过它,我发现问题是因为我使用了 fetch 语句。但直到现在我还没有发现如何解决它。任何帮助表示赞赏,谢谢。 以下是我的程序:
PROCEDURE IS_CLIENT_LOGGED_IN (P_CLIENT_NUM Varchar2,P_CURSOR out SYS_REFCURSOR ,P_COUNT OUT NUMBER,P_ERROR out Varchar2) AS
TYPE MyRec IS RECORD (ID VARCHAR2(100));
cur_rec MyRec;
lv_cur SYS_REFCURSOR;
BEGIN
BEGIN
Open lv_cur FOR
SELECT ID
FROM tbl_registration
WHERE tbl_client_id = P_CLIENT_NUM
AND tbl_logout_date is null;
LOOP
FETCH lv_cur INTO cur_rec;
EXIT WHEN P_CURSOR%notfound;
P_COUNT := P_CURSOR%rowcount;--will return row number beginning with 1
END LOOP;
P_CURSOR := lv_cur;
EXCEPTION WHEN OTHERS THEN
P_ERROR := 'Unable to select Data from tbl_registration' ||SQLERRM;
END;
网上搜索发现问题原因如下:
- 在检索到最后一行并返回 ORA-1403 错误后从游标中提取。
- 如果游标已使用 FOR UPDATE 子句打开,则在发出 COMMIT 后进行提取将返回错误。
- 重新绑定 SQL 语句中的所有占位符,然后在重新执行语句之前发出 fetch。
但我找不到合适的解决方案。
【问题讨论】:
-
很难预先获得要运行的查询的行数。本质上,这意味着运行相同的查询两次,或者运行查询,将结果读入数组并基于数组运行第二个查询。所以问问自己:真的有必要获取行数吗?我从来没有遇到过那种特殊的情况。