| Oracle FAQ | Your Portal to the Oracle Knowledge Grid | |
Home -> Community -> Usenet -> c.d.o.server -> Stored procedure failed: maximum open cursors exceeded
Dear Experts,
I have a problem with a simple stored procedure which is running under
the Oracle 9.2.0.4.0
64 bit environment. After 100 - 200 calls, this stored procedure
generates exception:
ORA-01000: maximum open cursors exceeded
Really there are no cursors in this procedure (see the text below), but
may be this exception is
a by-product of some other instructions. For the time being I just
close/open the database
connection after every exception of this type. Could you please give me
any idea why this
stored procedure is running out of cursor numbers and how I can fix
this problem.
Regards,
Serguei.
FUNCTION fn_calcSettlementDate(
exchCode fill.fl_ex_code%TYPE, tradeCrcy fill.fl_trade_ccy%TYPE, secType fill.fl_set_code%TYPE, seId fill.fl_se_id%TYPE, tradeDate DATE ) RETURN DATE IS v_settleExchCode fill.fl_ex_code%TYPE;
IF exchCode = 'ABCD' THEN
SELECT se_ex_code INTO v_settleExchCode FROM security WHERE se_id =
seId;
ELSE
v_settleExchCode := exchCode;
END IF;
DECLARE
v_sse_settle_date DATE;
BEGIN
SELECT sse_settle_date INTO v_sse_settle_date
FROM security_settle_exception WHERE sse_ex_code=v_settleExchCode
AND
sse_se_id=seId AND sse_trade_date=tradeDate;
RETURN v_sse_settle_date;
EXCEPTION
WHEN NO_DATA_FOUND THEN
NULL;
END;
DECLARE
v_cse_settle_date DATE;
BEGIN
SELECT cse_settle_date INTO v_cse_settle_date
FROM calendar_settle_exception, exchange_calendar WHERE
ec_ex_code=v_settleExchCode AND ec_ccy_iso_code=tradeCrcy AND
ec_set_code=secType AND
cse_ec_id=ec_id AND cse_trade_date=tradeDate;
RETURN v_cse_settle_date;
EXCEPTION
WHEN NO_DATA_FOUND THEN
NULL;
END;
DECLARE
v_settle_date DATE;
v_day_of_week NUMBER(1);
v_ec_id exchange_calendar.ec_id%TYPE;
v_settle_days NUMBER(2);
BEGIN
SELECT ec_id, ec_settle_period INTO v_ec_id, v_settle_days FROM
exchange_calendar WHERE
ec_ex_code=v_settleExchCode AND ec_ccy_iso_code=tradeCrcy AND
ec_set_code=secType;
v_settle_date := tradeDate;
v_day_of_week := TO_CHAR( v_settle_date, 'D' );
IF v_day_of_week=1 THEN
v_settle_days := v_settle_days - 1;
v_day_of_week := 2;
v_settle_date := v_settle_date + 1;
ELSIF v_day_of_week=7 THEN
v_settle_days := v_settle_days - 1;
v_day_of_week := 2;
v_settle_date := v_settle_date + 2;
END IF;
LOOP
IF v_day_of_week!=1 AND v_day_of_week!=7 THEN
IF v_settle_days <= 0 THEN
BEGIN
SELECT eh_ec_id INTO v_ec_id FROM exchange_holiday
WHERE eh_ec_id=v_ec_id AND eh_date=v_settle_date;
EXCEPTION
WHEN NO_DATA_FOUND THEN
RETURN v_settle_date;
END;
ELSE
v_settle_days := v_settle_days - 1;
END IF;
END IF;
v_settle_date := v_settle_date + 1;
v_day_of_week := v_day_of_week mod 7 + 1;
END LOOP;
END;
![]() |
![]() |