* [[http://www.wikioracle.es/doku.php|Inicio]]
NEWCOL
* [[http://www.wikioracle.es/doku.php?idx=wiki|Indice]]
NEWCOL
* [[http://www.wikioracle.es/doku.php?id=oracle_sql_scripts:00_directorio_de_scripts|Directorio de Scripts]]
NEWCOL
* [[http://www.wikioracle.es/doku.php?id=bugs|Problemas y Bugs]]
====== 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.
----
* [[http://www.wikioracle.es/doku.php|Inicio]]
NEWCOL
* [[http://www.wikioracle.es/doku.php?idx=wiki|Indice]]
NEWCOL
* [[http://www.wikioracle.es/doku.php?id=oracle_sql_scripts:00_directorio_de_scripts|Directorio de Scripts]]
NEWCOL
* [[http://www.wikioracle.es/doku.php?id=bugs|Problemas y Bugs]]