ORA-01000 Problemas, bugs y soluciones
En este documento describiremos el error ORA-01000, soluciones a los bugs detectados, tuning de código, etc
Versión Afectada
Cualquiera
Introduccion
Descripcion del problema:
Uno de los errores más comunes es ORA-01000:
ORA-01000: "maximum open cursors exceeded"
Cause: A host language program attempted to open too many cursors.
The initialization parameter OPEN_CURSORS determines the
maximum number of cursors per user.
Action: Modify the program to use fewer cursors. If this error occurs
often, shut down Oracle, increase the value of OPEN_CURSORS,
and then restart Oracle.
Este error sucede mucho en asociación con algún tipo de aplicación, ya sea Oracle Office, OCI, Pro*C, Visual Basic, CDE Tools (Reportwriter, Forms, etc.), Financial Applications, etc.
Este error también sucede en la base de datos, con tan sólo las inserciones, actualizaciones, delete, etc en PL / SQL o en SQL * Plus, etc
La razón por la que recibe este error se debe a que Oracle ha alcanzado el límite fijado para los cursores abiertos para ese ejecutable o el usuario en su sesion. Hay dos tipos de cursores abiertos: implícitos y explícitos. Aquí hay algunos antecedentes sobre cómo trabajan los cursores.
Para procesar una sentencia SQL, Oracle abre un área de trabajo llamada área privada SQL. Esta área privada SQL almacena la información necesaria para ejecutar una sentencia SQL. Los cursores se almacenan en este ámbito para realizar un seguimiento de la información.
Un cursor implícito se declara todos los datos para la definición de manipulación de datos y declaraciones. Estos son internos a Oracle. Para las consultas que devuelvan más de una fila, usted debe declarar explícitamente el cursor para recuperar toda la información. Usted puede tunear cursores explícitos más fácilmente porque usted puede decidir cuándo abrir y cerrarlos.
Los cursores implícitos son más difíciles de tunear, ya que son internos a Oracle. Si su aplicación está afinada con cuidado, puede reducir el número de cursores implícito abierto.
ORA-1000
BUGS Relacionados con ORA-01000
Bug 4024882 ORA-1000, EXECUTING DBMS_MVIEW.REFRESH IN A PL/SQL LOOP The complete errors look something like: ORA-1000: maximum open cursors exceeded ORA-6512: at "SYS.DBMS_SNAPSHOT", line ORA-6512: at "SYS.DBMS_SNAPSHOT", line ORA-6512: at "SYS.DBMS_SNAPSHOT", line ORA-6512: at line
Wokaround
execute immediate 'begin dbms_mview.refresh('''||'testtab_snap'||'''); end;';
Versión Solucion
10.2
Workarounds ORA-01000
Descripción:
Hay dos maneras de evitar este ORA-01000 error. Usted puede ajustar el cursor en el uso de la base de datos y en el nivel de aplicación.
Tuning en la BASE DE DATOS
Hay un parámetro que puede configurar en el init.ora que determina el número de cursores de un usuario puede abrir en un período de sesiones: OPEN_CURSORS.
OPEN_CURSORS por defecto es 50 y por lo general, esto no es lo suficientemente alto. El más alto valor puede configurar este parámetro es dependiente del sistema operativo.
Consecuencias a la evolución de este parámetro:
Este parámetro no afecta el rendimiento en modo alguno, pero ahora Oracle necesidad un poco más de memoria para almacenar los cursores.
Tuning a nivel de la aplicación
Hay tres parámetros que afectan a la manipulación cursores en la aplicación Nivel: RELEASE_CURSOR, HOLD_CURSOR, MAXOPENCURSORS. Usted debe establecer estas parámetros en el nivel precompiler.
HOLD_CURSOR por defecto es NO. Esto significa que, después de Oracle SQL ejecuta un declaración de los vínculos con el cursor caché, la memoria, y analizar las cerraduras son liberados y marcó para su reutilización. Para más detalles referirse a Programmer's Guide para Precompilers Versión 1.6 p.6-16.
RELEASE_CURSOR por defecto es NO. Esto significa que, después de Oracle SQL ejecuta un declaración, los enlaces con el cursor caché se mantiene y no en libertad. Para obtener más información, consulte la Guía del Programador para Precompilers Versión 1.6 p.6-26.
Estos dos parámetros se deben usar para que sean eficaces. Aquí está una tabla que muestra cómo la configuración de los dos parámetros de interactuar.
| HOLD_CURSOR | RELEASE_CURSOR | enlaces son … |
|---|---|---|
| NO | no aplicable | marcados como reutilizables |
| SÍ | NO | mantenido |
| NO | SÍ | eliminado inmediatamente |
| N / A | SÍ | eliminado inmediatamente |
Para resolver el ORA-01000 error, debe configurar HOLD_CURSOR = NO y RELEASE_CURSOR = YES. De esta manera, después de los cursores se utilizan, Oracle se libera la memoria de otros cursores.
Consecuencias de establecer estos parámetros HOLD_CURSOR = NO y RELEASE_CURSOR = YES:
Esto hará que Oracle a la liberación de los vínculos y cerraduras para cada cursor después de la SQL se ejecuta. Esto significa que la próxima vez que Oracle necesita cuestión la misma sentencia SQL, Oracle tendrá que la declaración de reanálisis, y reconstruir el plan de ejecución. Esto hará que algunos de rendimiento generales.
MAXOPENCURSORS por defecto es 10. Este número indica el número de concurrentes cursores de abrir la precompiler que intenta mantener en caché. Se especifica el tamaño inicial del cursor caché. El límite de este parámetro se determina por que se estableció a OPEN_CURSORS. Aquí está la fórmula:
MAXOPENCURSORS + 6 ⇐ OPEN_CURSORS
6 es la sobrecarga cursores Oracle necesidades.
Aquí está un cálculo del número máximo de cursores en uso:
SQL cursores
PL / SQL padre cursores
PL / SQL niño cursores
6 cursores para gastos generales
-----------------------
Suma de los cursores en uso.
Discusión
HOLD_CURSOR = NO y RELEASE_CURSOR = YES: esto aplica para que version