如何使用SYS_REFCURSOR-ORACLE处理找不到数据

如何使用SYS_REFCURSOR-ORACLE处理找不到数据,oracle,plsql,Oracle,Plsql,如果我的选择没有使用SYS\u REFCURSOR得到结果,我该怎么办 到目前为止,我尝试的是使用未找到的数据,但它不起作用,我的状态一直将我返回为=1 代码: 有什么想法吗 谢谢 真正的sql是这样的: 编辑 在代码中,您只是打开光标,而不是从中提取。打开游标时,PL/SQL将执行该游标的查询。它还标识满足WHERE子句和联接条件中的条件的行。OPEN实际上不检索这些行中的任何一行;该操作由FETCH语句执行。然后使用游标属性检查结果集是否为空;如果是,则以下游标属性将具有以下值:%FOUND

如果我的选择没有使用SYS\u REFCURSOR得到结果,我该怎么办

到目前为止,我尝试的是使用未找到的数据,但它不起作用,我的状态一直将我返回为=1

代码:

有什么想法吗

谢谢

真正的sql是这样的:

编辑


在代码中,您只是打开光标,而不是从中提取。打开游标时,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;