0

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

请建议我如何计算参考游标中的行数

4

1 回答 1

1

您可以执行以下操作:

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;

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

分享和享受。

于 2013-05-07T11:12:48.317 回答