variable tipo salida que procedimientos parametro manejo implicito hace cursores como anidados almacenados plsql cursor implicit

plsql - tipo - ¿Alguna vez un cursor implícito no se cerrará en PL/SQL?



que hace un cursor en pl sql (3)

Con PL / SQL, ¿habrá alguna vez una situación, por ejemplo, en el caso de una excepción, donde un cursor implícito no se cerrará?

Entiendo que se supone que un cursor implícito se cierra después de su uso, pero solo quiero saber si alguna vez hay una situación en la que este no sea el caso, y si esto es posible, qué tipo de solución será una buena idea.


Definamos un "cursor implícito" como una instrucción SELECT ejecutada en un ciclo FOR.

Mirándolo desde un punto de vista práctico, independientemente de si es posible o no dejar abierto un cursor implícito, la pregunta importante es "¿Qué puedes hacer al respecto?". Según mi leal saber y entender, la respuesta a esa pregunta es "Nada". No tiene una variable de cursor para trabajar, no hay forma (que yo sepa) de acceder al cursor implícito y, por lo tanto, no puede afectarlo.

Hay dos cosas que puedes hacer. El primero es evitar por completo el uso de cursores implícitos. Solo use cursores explícitos, realice todos los pasos de apertura, búsqueda, cierre, etc. Esto le brinda el máximo nivel de control. Si te gustan este tipo de cosas, ve por ello.

Por otro lado, puede usar cursores implícitos y simplemente no preocuparse. Estoy bien sin preocuparme. :-) En serio, sin embargo, los cursores implícitos son mucho mejores que los cursores explícitos. Hay menos código para escribir y, por lo tanto, menos código para atornillar. El sistema puede, en ciertas circunstancias, optimizar el uso de cursores implícitos sin necesidad de escribir un montón de código adicional. El código que escribe es más limpio y más fácil de entender, no es una preocupación si trabaja en una tienda de un solo hombre donde escribe y mantiene todo el código, pero aquí en Corporateville a menudo tenemos que escribir código que otros mantendrán y viceversa , y se considera cortés entregar el código más claro y claro que podamos. Hay momentos (como cuando se devuelve una variable de cursor a una persona que llama desde fuera de Oracle) cuando son necesarios cursores explícitos, pero para la mayoría de los códigos estoy usando cursores for-LOOP implícitos, ¡ y LOVING ! (Y puntos de bonificación adicionales para aquellos que pueden recordar de dónde viene eso :-)

Comparte y Disfruta.


Voy a suponer que estás hablando de cursores implícitos, es decir, una instrucción SELECT INTO ... o DML ejecutada dentro de un bloque PL / SQL en oposición a un ciclo FOR.

Al igual que con los cursores explícitos, los cursores implícitos tienen atributos; puede usar SQL%NOTFOUND (en lugar de CURSOR_NAME%NOTFOUND por ejemplo).

Para citar la documentación 11.1 sobre atributos de cursor implícitos para SQL%ISOPEN :

Siempre devuelve FALSO, porque la base de datos cierra automáticamente el cursor SQL después de ejecutar su declaración SQL asociada.

En mi opinión, esto debería interpretarse en el sentido de que los cursores se cerrarán después de la ejecución, ya sea que se genere una excepción o no. Después de todo, una ejecución detenida debido a una excepción sigue siendo una instrucción SQL ejecutada.

El motivo se ha eliminado de la documentación 11.2 .

SQL% ISOPEN siempre tiene el valor FALSE.

Parece que se ha agregado al capítulo sobre cursores implícitos en su lugar:

SQL% ISOPEN siempre devuelve FALSE, porque un cursor implícito siempre se cierra después de la ejecución de su declaración asociada.

Si el cursor se cierra o no realmente no importa debido a la respuesta a su pregunta final, "qué tipo de solución será una buena idea". . Para citar del mismo capítulo:

No puede controlar un cursor implícito, pero puede obtener información de sus atributos.

Entonces, no. No hay remedio posible; es imposible cerrar explícitamente un cursor abierto implícitamente.

Lo que quizás quiera probar es si puede elevar ORA-0100: Se han excedido los cursores máximos utilizando únicamente cursores implícitos ya que esta es la peor consecuencia que se me ocurre.


Cuando falla COMMIT or ROLLBACK el cursor no se cierra automáticamente
Se recomienda utilizar la ruta siguiente cuando se utilizan cursores:

-- before using the cursor IF your_cursor %ISOPEN THEN CLOSE your_cursor; END IF; OPEN your_cursor; -- after using the cursor CLOSE your_cursor; -- when exception IF your_cursor %ISOPEN THEN CLOSE your_cursor; END IF;