¿Es necesario commit después de la operación DML en Función / Procedimiento?


20

Me pregunto si es necesario escribir commit después de insertar / eliminar / actualizar en función / procedimiento.

Ejemplo:

create or replace function test_fun
return number is
begin
   delete from a;
   return 0;
end;

o procedimiento

create or replace procedure aud_clear_pro
as
begin
   delete from a;
end;

¿necesita confirmación después de eliminar?

No puedo entender la siguiente situación:

  1. Si llamo a la función / procedimiento desde la ventana SQL, entonces requiere confirmación

    pero

  2. Si programo una función / procedimiento usando dbms_scheduler y ejecuto el trabajo, la declaración de eliminación se confirma automáticamente.

    ¿POR QUÉ?

Respuestas:


24

En general, los procedimientos no deberían comprometerse. Ese tipo de decisiones de control de transacciones deben dejarse a un código de nivel superior que sepa cuándo una transacción lógica está realmente completa. Si se compromete dentro de un procedimiento almacenado, está limitando su reutilización porque una persona que llama que quiere que los cambios que realice el procedimiento formen parte de una transacción mayor no puede simplemente llamar al procedimiento directamente.

Si llama a un procedimiento de forma interactiva, tendrá que confirmar o revertir explícitamente la transacción porque Oracle no tiene idea si piensa que la llamada al procedimiento sea una transacción lógica o si tiene la intención de componer una transacción más grande que involucre llamadas a múltiples procedimientos. Si usa dbms_scheduler, dbms_schedulerasume que un trabajo es una transacción lógica y se compromete al final del trabajo asumiendo que fue exitoso ( dbms_jobhace lo mismo).

Las funciones no deben manipular los datos en primer lugar. No se puede invocar una función que manipula datos desde una instrucción SQL (salvo el caso de la esquina donde se declara que la función en sí misma utiliza una transacción autónoma que casi nunca es apropiada). El punto principal de tener funciones y procedimientos es que las funciones se pueden incrustar en sentencias SQL y se pueden otorgar más libremente a los usuarios porque no cambian ningún dato.


1
¿No es posible en Oracle que la persona que llama comience una transacción que vincula las llamadas a procedimientos? En SQL Server puede confirmar dentro del procedimiento, pero si la persona que llama abrió una transacción antes de llamar a ese procedimiento, nada se confirma hasta que la persona que llama también se compromete.
Nick Chammas

44
@NickChammas: Oracle no tiene el concepto de una transacción anidada, no. Si el procedimiento se compromete, todo lo que la persona que llama había hecho hasta ese momento se comprometería. La persona que llama siempre inicia una transacción implícitamente con su primera instrucción (ya sea una llamada a procedimiento u otra cosa), por lo que siempre debe depender de la persona que llama para finalizar la transacción.
Justin Cave

@JustinCave Si bien eso es cierto, no se olvide de las transacciones autónomas.
Philᵀᴹ

@ Phil - Cierto, pero ese es un animal muy diferente. Una transacción autónoma no puede ver los cambios no confirmados realizados por la persona que llama y la persona que llama no puede revertirla, por lo que es extremadamente improbable que se declare que otra cosa que no sea un procedimiento de registro para utilizar una transacción autónoma.
Justin Cave

4

Para responder tu pregunta; ¿POR QUÉ?

Probablemente ya lo sepas ya que la publicación tiene 2 años. Pero responderé solo por el registro.

La razón # 1 requiere una confirmación y no # 2 es porque la configuración de base de datos predeterminada en Oracle es confirmar una transacción cuando finaliza una sesión. Si está en sqlplus y ejecuta su código manualmente, no confirmará la transacción de inmediato. Si emite una confirmación explícita O cierra la sesión de sqlpus, la transacción se confirmará.

La razón por la que obtienes una confirmación automática en el n. ° 2 es porque crea una sesión para ejecutar tu script. Cuando se completa, se cierra automáticamente, lo que provocará una confirmación automática.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.