web-dev-qa-db-fra.com

La validation est-elle nécessaire après l'opération DML dans la fonction / procédure?

Je me demande s'il est nécessaire d'écrire commit après insertion/suppression/mise à jour dans la fonction/procédure?

Exemple:

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

ou procédure

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

faut-il valider après la suppression?

Impossible de comprendre la situation suivante:

  1. Si j'appelle la fonction/procédure à partir de la fenêtre SQL, cela nécessite un commit

    mais

  2. Si je planifie une fonction/procédure à l'aide de dbms_scheduler et exécute le travail, l'instruction delete est automatiquement validée.

    POURQUOI?

20
kupa

En général, les procédures ne devraient pas s'engager. Ces types de décisions de contrôle des transactions doivent être laissés à un code de niveau supérieur qui sait quand une transaction logique est réellement terminée. Si vous vous engagez à l'intérieur d'une procédure stockée, vous limitez sa réutilisabilité car un appelant qui souhaite que les modifications apportées à la procédure fassent partie d'une transaction plus importante ne peut pas simplement appeler directement la procédure.

Si vous appelez une procédure de manière interactive, vous devrez valider ou annuler explicitement la transaction car Oracle n'a aucune idée si vous envisagez que l'appel de procédure soit une transaction logique ou si vous avez l'intention de composer une transaction plus importante impliquant plusieurs appels de procédure. Si tu utilises dbms_scheduler, dbms_scheduler suppose qu'un travail est une transaction logique et valide à la fin du travail en supposant qu'il a réussi (dbms_job fait la même chose).

Les fonctions ne doivent pas manipuler les données en premier lieu. Une fonction qui manipule des données ne peut pas être appelée à partir d'une instruction SQL (sauf le cas du coin où la fonction elle-même est déclarée utiliser une transaction autonome qui n'est presque jamais appropriée). L'intérêt d'avoir des fonctions et des procédures est que les fonctions peuvent être intégrées dans des instructions SQL et peuvent être accordées plus librement aux utilisateurs car elles ne modifient aucune donnée.

24
Justin Cave

Pour répondre à ta question; POURQUOI?

Vous le savez probablement déjà depuis que le poste a 2 ans. Mais je répondrai juste pour mémoire.

La raison n ° 1 nécessite une validation et la n ° 2 ne l'est pas parce que le paramètre de base de données par défaut dans Oracle est de valider une transaction à la fin d'une session. Si vous êtes dans sqlplus et exécutez votre code manuellement, la transaction ne sera pas validée immédiatement. Si vous émettez un commit explicite OR vous vous déconnectez de sqlpus, la transaction sera validée.

La raison pour laquelle vous obtenez une validation automatique sur # 2 est qu'elle crée une session pour exécuter votre script. Une fois terminé, il se déconnecte automatiquement, ce qui entraînera une validation automatique.

4
Steve Cunningham