返回游标函数使用异常

使用游标测试时,使用函数返回游标,调用次数稍微多就报错

模拟数据

CREATE TABLE TM_TEST (L_RISK_NO1 varchar(10),L_RISK_NO2 varchar(10))

1、这种没问题。

 DECLARE
    -- Non-scalar parameters require additional processing
    PL_SERIAL_NO VARCHAR2(32767) := 111;
    P_ENTRY_RELATION_CURSOR SYS_REFCURSOR;
    P_ENTRY_RELATION_CUR SYS_REFCURSOR;
    result SYS_REFCURSOR;
  BEGIN
    -- Call the function
    FOR I IN 1.. 40 LOOP
      DBMS_OUTPUT.PUT_LINE(I);
    OPEN P_ENTRY_RELATION_CUR FOR
    SELECT A.L_RISK_NO1,
           A.L_RISK_NO2
      FROM TM_TEST A
     WHERE A.L_RISK_NO1 = I
        OR A.L_RISK_NO2 = I;
    END LOOP;
  END

2、这种有问题,调用次数40次就报错(可能机器不一样,情况不一样)

 DECLARE
    -- Non-scalar parameters require additional processing
    PL_SERIAL_NO VARCHAR2(32767) := 111;
    P_ENTRY_RELATION_CURSOR SYS_REFCURSOR;
    P_ENTRY_RELATION_CUR SYS_REFCURSOR;
    result SYS_REFCURSOR;
  BEGIN
    -- Call the function
    FOR I IN 1.. 40 LOOP
      DBMS_OUTPUT.PUT_LINE(I);
      P_ENTRY_RELATION_CURSOR := FN_9902_TR_TM_TEST(I);
    END LOOP;
  END

--报错
 maximum open cursors exceeded at function RISK.FN_9902_TR_TM_TEST

导致返回游标的函数不能过多的使用。

FN_9902_TR_TM_TEST内容

CREATE OR REPLACE FUNCTION FN_9902_TR_TM_TEST(PL_SERIAL_NO VARCHAR2)
  RETURN SYS_REFCURSOR
 AS
  P_ENTRY_RELATION_CUR SYS_REFCURSOR;
BEGIN
  OPEN P_ENTRY_RELATION_CUR FOR
    SELECT A.L_RISK_NO1,
           A.L_RISK_NO2
      FROM TM_TEST A
     WHERE A.L_RISK_NO1 = PL_SERIAL_NO
        OR A.L_RISK_NO2 = PL_SERIAL_NO;
  RETURN P_ENTRY_RELATION_CUR;
END FN_9902_TR_TM_TEST;