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


20

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?

Réponses:


24

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 vous utilisez dbms_scheduler, dbms_schedulersuppose qu'un travail est une transaction logique et valide à la fin du travail en supposant qu'il a réussi ( dbms_jobfait 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.


1
N'est-il pas possible dans Oracle que l'appelant commence une transaction qui lie les appels de procédure? Dans SQL Server, vous pouvez valider dans la procédure, mais si l'appelant a ouvert une transaction avant d'appeler cette procédure, rien n'est validé tant que l'appelant ne s'est pas engagé.
Nick Chammas

4
@NickChammas - Oracle n'a pas le concept d'une transaction imbriquée, non. Si la procédure est validée, tout ce que l'appelant a fait jusque-là est validé. L'appelant démarre toujours une transaction implicitement avec sa première instruction (que ce soit un appel de procédure ou autre), il devrait donc toujours appartenir à l'appelant de mettre fin à la transaction.
Justin Cave

@JustinCave Bien que cela soit vrai, n'oubliez pas les transactions autonomes.
Philᵀᴹ

@Phil - C'est vrai, mais c'est un animal très différent. Une transaction autonome ne peut pas voir les modifications non validées apportées par l'appelant et ne peut pas être annulée par l'appelant, il est donc extrêmement peu probable que quoi que ce soit d'autre qu'une procédure de journalisation soit déclarée pour utiliser une transaction autonome.
Justin Cave

4

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 le compte rendu.

La raison n ° 1 nécessite une validation et la n ° 2 ne l'est pas car 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 OU 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.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.