如何使用SYS_REFCURSOR-ORACLE处理找不到数据
如果我的选择没有使用SYS\u REFCURSOR得到结果,我该怎么办 到目前为止,我尝试的是使用未找到的数据,但它不起作用,我的状态一直将我返回为=1 代码: 有什么想法吗 谢谢 真正的sql是这样的: 编辑如何使用SYS_REFCURSOR-ORACLE处理找不到数据,oracle,plsql,Oracle,Plsql,如果我的选择没有使用SYS\u REFCURSOR得到结果,我该怎么办 到目前为止,我尝试的是使用未找到的数据,但它不起作用,我的状态一直将我返回为=1 代码: 有什么想法吗 谢谢 真正的sql是这样的: 编辑 在代码中,您只是打开光标,而不是从中提取。打开游标时,PL/SQL将执行该游标的查询。它还标识满足WHERE子句和联接条件中的条件的行。OPEN实际上不检索这些行中的任何一行;该操作由FETCH语句执行。然后使用游标属性检查结果集是否为空;如果是,则以下游标属性将具有以下值:%FOUND
在代码中,您只是打开光标,而不是从中提取。打开游标时,PL/SQL将执行该游标的查询。它还标识满足WHERE子句和联接条件中的条件的行。OPEN实际上不检索这些行中的任何一行;该操作由FETCH语句执行。然后使用游标属性检查结果集是否为空;如果是,则以下游标属性将具有以下值:%FOUND=FALSE、%NOTFOUND=TRUE和%ROWCOUNT=0 以下是一个例子:
SQL> DECLARE
2 l_cur SYS_REFCURSOR;
3 l_col VARCHAR2 (10);
4 BEGIN
5 OPEN l_cur FOR
6 SELECT 'Hi there' col
7 FROM DUAL
8 WHERE 1 = 0;
9
10 DBMS_OUTPUT.put_line ('Opened cursor');
11
12 FETCH l_cur INTO l_col;
13
14 DBMS_OUTPUT.put_line ('Fetched from cursor');
15
16 IF l_cur%NOTFOUND
17 THEN
18 DBMS_OUTPUT.put_line ('Oops! No data found. Raising exception...');
19 RAISE NO_DATA_FOUND;
20 END IF;
21
22 CLOSE l_cur;
23 EXCEPTION
24 WHEN NO_DATA_FOUND
25 THEN
26 DBMS_OUTPUT.put_line ('Exception raised.');
27 END;
28 /
Opened cursor
Fetched from cursor
Oops! No data found. Raising exception...
Exception raised.
PL/SQL procedure successfully completed.
要稍微修改@Eddie Awad的答案,我用于从游标变量获取的常用代码模式如下:
DECLARE
l_cur SYS_REFCURSOR;
l_col VARCHAR2 (10);
BEGIN
OPEN l_cur FOR
SELECT 'Hi there' col
FROM DUAL
WHERE 1 = 0;
DBMS_OUTPUT.PUT_LINE('Opened cursor');
<<cursor_loop>>
LOOP
FETCH l_cur INTO l_col;
DBMS_OUTPUT.PUT_LINE('Fetched from cursor');
EXIT cursor_loop WHEN l_cur%NOTFOUND;
DBMS_OUTPUT.PUT_LINE('Process data fetched from cursor');
END LOOP; -- cursor_loop
CLOSE l_cur;
DBMS_OUTPUT.PUT_LINE('Closed cursor');
END;
其思想是打开游标变量或从过程中获取它,然后循环,直到从游标中获取所有行
分享和享受。通常当你使用光标时,你做得很糟糕。你想干什么?另外,您也可以只做if exists,从cod=1的表中选择name来测试是否存在任何行。@Eric:代码只是一个示例,将编辑并显示给您all@Eric:检查更新,这是一个存储过程,用于Web服务器phpmaking测试,稍后返回结果。
SQL> DECLARE
2 l_cur SYS_REFCURSOR;
3 l_col VARCHAR2 (10);
4 BEGIN
5 OPEN l_cur FOR
6 SELECT 'Hi there' col
7 FROM DUAL
8 WHERE 1 = 0;
9
10 DBMS_OUTPUT.put_line ('Opened cursor');
11
12 FETCH l_cur INTO l_col;
13
14 DBMS_OUTPUT.put_line ('Fetched from cursor');
15
16 IF l_cur%NOTFOUND
17 THEN
18 DBMS_OUTPUT.put_line ('Oops! No data found. Raising exception...');
19 RAISE NO_DATA_FOUND;
20 END IF;
21
22 CLOSE l_cur;
23 EXCEPTION
24 WHEN NO_DATA_FOUND
25 THEN
26 DBMS_OUTPUT.put_line ('Exception raised.');
27 END;
28 /
Opened cursor
Fetched from cursor
Oops! No data found. Raising exception...
Exception raised.
PL/SQL procedure successfully completed.
DECLARE
l_cur SYS_REFCURSOR;
l_col VARCHAR2 (10);
BEGIN
OPEN l_cur FOR
SELECT 'Hi there' col
FROM DUAL
WHERE 1 = 0;
DBMS_OUTPUT.PUT_LINE('Opened cursor');
<<cursor_loop>>
LOOP
FETCH l_cur INTO l_col;
DBMS_OUTPUT.PUT_LINE('Fetched from cursor');
EXIT cursor_loop WHEN l_cur%NOTFOUND;
DBMS_OUTPUT.PUT_LINE('Process data fetched from cursor');
END LOOP; -- cursor_loop
CLOSE l_cur;
DBMS_OUTPUT.PUT_LINE('Closed cursor');
END;