Ejecutar un procedimiento almacenado dentro de un bloque (transacción) anónimo – PL/SQL – Oracle.

Y seguimos con las tensiones mundiales a todo lo que da, este año iniciábamos con una posible guerra mundial y ahora tenemos una pandemia en curso (afortunadamente aunque el contagio es severo, el índice de mortandad – número de casos contra muertes es muy bajo por ahora).

Pero la vida tiene que seguir así que, a lo nuestro.

Una de las prácticas para base de datos en el tema de transacciones, es la de generación de datos aleatorios para alimentar una tabla de una base de datos de Oracle para un grupo y de MySQL para otro (donde en el caso de Oracle escribí hace algunos años un artículo sobre números aleatorios [1]).

En el grupo A, los jóvenes no pudieron mandar llamar un procedimiento almacenado (que es el que genera los datos aleatorios), por lo que tuvieron que correr los bloques de programación por separado.

Entonces…soy el profesor …jejeje …pues fuimos a la biblioteca gigante del Internet para buscar una solución y me encontré lo siguiente, en este post [2].

Me puse manos a la obra, como les mencioné, ya migré a Oracle 18c, y ahi es donde estamos trabajando para los ejemplos, no voy a resolver exactamente el problema sino pues que ciencia tendría y que les tocaría a ustedes.

Una de las cosas que vieron complicadas fue el preguntar si existe una tabla y si existe borrarla, para ello usamos una consulta al diccionario de datos de Oracle (en este caso la tabla USER_TABLES) y con ese bucle FOR-LOOP-END LOOP, si la tabla existe ponemos la variable en TRUE (verdadero), para después ejecutar el comando usando la instrucción EXECUTE IMMEDIATE, como pueden observar se aplica una clausula COMMIT, para que inmediatamente – en este caso – se borre la tabla.

Después de borrarla la podemos crear nuevamente con el mismo comando EXECUTE IMMEDIATE.

Ahora vamos a llamar el procedimiento almacenado, lo que intuyo, pues es mucho el trabajo de investigación y poco el tiempo, es que parece ser que las transacciones son independientes y pueden correr simultaneamente, por lo que al hacer un procedimiento con PRAGMA autonomus_transaction, la transacción que invoca al procedimiento almacenado, se detiene hasta que termina, para luego continuar el flujo.

Otra anotación importante es que a cada modificación en los objetos de la base de datos se tiene que dar nuestro COMMIT, para tener sus versiones más actualizadas.

Aquí el procedimiento almacenado.

Y por último ejecutamos todo el bloque de programación y listo.

Podemos observar el resultado en la tabla HR_SALES.

Pues …creo …que el profe 1 – mis alumnos 0, entonces todos tienen un punto menos en este trabajo.

……………………………………………………………………………………………………………..………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………..

Es una broma…pero no hay que dejarse vencer tan rápido, Oracle es un excelente motor de base de datos y en un futuro trabajo no podemos salir con…mejor en MySQL porque esta más fácil.

Saludos.

Profesor Miguel Araujo.

Webgrafía

[1] Blog sobre Tecnologías de la Información y Comunicación.

https://parapasarso.blogcindario.com/2015/06/00021-insertar-valores-fuera-de-rango-en-pl-sql.html

[2] Wiki Dos Ideas

https://dosideas.com/wiki/Transacciones_Autonomas_En_Oracle

Deja un comentario