Oracle 是否计算refcursor中的行数?

Oracle 是否计算refcursor中的行数?,oracle,plsql,oracle11g,plsqldeveloper,Oracle,Plsql,Oracle11g,Plsqldeveloper,我有一个将refcursor作为out参数的过程。我需要计算ref游标中的行数,如果超过最大限制,我需要发送错误消息 请建议我如何计算ref光标中的行数。您可以执行以下操作: FUNCTION SOME_FUNC(pin_Count_limit NUMBER, pout_Cursor SYS_REFCURSOR) RETURN NUMBER -- returns the number of lines the cursor should r

我有一个将refcursor作为out参数的过程。我需要计算ref游标中的行数,如果超过最大限制,我需要发送错误消息


请建议我如何计算ref光标中的行数。您可以执行以下操作:

FUNCTION SOME_FUNC(pin_Count_limit  NUMBER,
                   pout_Cursor      SYS_REFCURSOR)
  RETURN NUMBER  -- returns the number of lines the cursor should return
IS
  strBasic_sql        VARCHAR2(32767) :='SELECT COL1, COL2, COL3 FROM TABLE1';
  cursorOut           SYS_REFCURSOR;
  cursorCount         SYS_REFCURSOR;
  nCount              NUMBER;
  bCursor_out_open    BOOLEAN := FALSE;
  bCursor_count_open  BOOLEAN := FALSE;
BEGIN
  OPEN cursorCount FOR 'SELECT COUNT(*) FROM (' || strBasic_sql || ')';
  bCursor_count_open := TRUE;
  FETCH cursorCount INTO nCount;
  CLOSE cursorCount;
  bCursor_count_open := FALSE;

  IF nCount < pin_Count_limit THEN
    OPEN cursorOut FOR strBasic_sql;
    bCursor_out_open := TRUE;
    pout_Cursor := cursorOut;
  ELSE
    DBMS_OUTPUT.PUT_LINE('Cursor returns too many rows');
  END IF;

  RETURN nCount;
EXCEPTION
  WHEN OTHERS THEN
    IF bCursor_count_open = TRUE THEN
      CLOSE cursorCount;
    END IF;

    IF bCursor_out_open = TRUE THEN
      CLOSE cursorOut;
    END IF;

    RAISE;
END SOME_PROC;
请注意,由于在打开“计数”光标和打开“真实”光标之间的数据库活动,“真实”光标返回的行数可能与预期的不同


共享并享受。

除了获取所有行之外,没有其他方法可以计算refcursor的行数。@Mani:不获取行数,就无法获取refcursor的行数。一种可能的解决方案是在光标的select子句中添加另一列count*,这将为您提供游标中的总记录数。因此,在获取第一条记录后,您将了解游标中的总计数,基于此,您可以继续执行您的逻辑,但这种方法速度较慢,不推荐使用。请查看此帖子