Pb sous PL/SQL : correspondance de Transaction ?

Pb sous PL/SQL : correspondance de Transaction ? - SQL/NoSQL - Programmation

Marsh Posté le 03-06-2004 à 17:46:49    

Voila je dois migrer des procedures SQL Server en Oracle et je ne vois quelle est la correspondance au mot clef "TRANSACTION" ?
En fait ca sert à executer plusieurs suppressions ou plusieur insertions en même temps et si une est impossible il efface les précédentes.
ex en SQL Server :
 

Code :
  1. BEGIN TRANSACTION
  2. /* Suppression autorisation portail groupe */
  3. Delete from T_ANN_AUT_PORTAIL_GRP
  4. WHERE  APG_intID_GRP = @IDGrp
  5. /* Suppression autorisation APPLI groupe */
  6. Delete from T_ANN_AUT_APPLI_GRP
  7. WHERE  AAG_intID_GRP = @IDGrp
  8. /* Suppression Groupe Collaborateur*/
  9. delete from T_ANN_GRP_COL
  10. WHERE GRC_intID_GRP =  @IDGrp
  11. /*Suppression Groupe*/
  12. delete from T_ANN_GROUPE
  13. WHERE GRP_intID =  @IDGrp
  14. COMMIT


 
@IDGrp etant un parametre en entrée.
 
Si quelqu'un connait la correspondance en PL/SQL merci de me la poster.

Reply

Marsh Posté le 03-06-2004 à 17:46:49   

Reply

Marsh Posté le 04-06-2004 à 08:55:37    

sous Oracle, les transactions sont là de base.
 
Si tu fais plusieurs requêtes et que tu veux à un point précis que la transaction se fasse, il suffit de faire 'COMMIT' :)
et si tu veux annuler tout ce qui a été fait depuis le dernier point de COMMIT, c'est 'ROLLBACK'.
 
Donc en gros, c'est pareil, sauf que le 'BEGIN TRANSACTION' est inutile sous Oracle.

Reply

Marsh Posté le 04-06-2004 à 08:57:08    

et voilà ce que ça donnerait en PL/SQL :
 

Code :
  1. BEGIN
  2.   /* Suppression autorisation portail groupe */ 
  3.   Delete from T_ANN_AUT_PORTAIL_GRP 
  4.   WHERE  APG_intID_GRP = :IDGrp;
  5.   /* Suppression autorisation APPLI groupe */ 
  6.   Delete from T_ANN_AUT_APPLI_GRP 
  7.   WHERE  AAG_intID_GRP = :IDGrp;
  8.   /* Suppression Groupe Collaborateur*/
  9.   delete from T_ANN_GRP_COL
  10.   WHERE GRC_intID_GRP =  :IDGrp;
  11.   /*Suppression Groupe*/
  12.   delete from T_ANN_GROUPE
  13.   WHERE GRP_intID =  :IDGrp;
  14.   COMMIT;
  15. END;


 
Le BEGIN / END sont nécessaires pour commencer et arrêter une procédure.


Message édité par Beegee le 04-06-2004 à 11:11:26
Reply

Marsh Posté le 04-06-2004 à 10:05:32    

non mais on s'est pas compris je pense ... Il faut que si la suppression marche sur les 2 premieres requetes et pas la 3ème il me rétablisse les 2 précédentes. Il faut que le commit se fasse seulement si toutes les requetes de suppression (ici 4) on effacé une ligne dans la table ! Le rollback doit s'enclencher en cas d'impossiblité d'une suppression.
Donc ta solution ne m'avance pas ou sinon je t'ai pas compris ...

Reply

Marsh Posté le 04-06-2004 à 11:21:45    

je comprenais pas trop ce que tu appelais 'impossibilité d'une suppression'.
 
Si tu fais un DELETE abec IDGrp qui n'apparaît pas à la table, il n'y a pas d'erreur, le DELETE n'efface rien. Donc il faut récupérer le nombre de lignes touchées par le DELETE, et si ce nombre est 0 après une des 4 requêtes effectuées, on fait un ROLLBACK.

Reply

Marsh Posté le 04-06-2004 à 11:26:41    

C'est SQL%ROWCOUNT qui donne le nombre de lignes affectées par une requête.
 
Donc ton code peut s'écrire :
 

Code :
  1. BEGIN
  2.  
  3.     /* Suppression autorisation portail groupe */ 
  4.     Delete from T_ANN_AUT_PORTAIL_GRP 
  5.     WHERE  APG_intID_GRP = :IDGrp;
  6.     IF SQL%ROWCOUNT=0 THEN
  7.         ROLLBACK;
  8.         EXIT;
  9.     END IF;
  10.     /* Suppression autorisation APPLI groupe */ 
  11.     Delete from T_ANN_AUT_APPLI_GRP 
  12.     WHERE  AAG_intID_GRP = :IDGrp;
  13.     IF SQL%ROWCOUNT=0 THEN
  14.         ROLLBACK;
  15.         EXIT;
  16.     END IF;
  17.  
  18.     /* Suppression Groupe Collaborateur*/ 
  19.     delete from T_ANN_GRP_COL 
  20.     WHERE GRC_intID_GRP =  :IDGrp;
  21.     IF SQL%ROWCOUNT=0 THEN
  22.         ROLLBACK;
  23.         EXIT;
  24.     END IF;
  25.  
  26.     /*Suppression Groupe*/ 
  27.     delete from T_ANN_GROUPE 
  28.     WHERE GRP_intID =  :IDGrp;
  29.     IF SQL%ROWCOUNT=0 THEN
  30.         ROLLBACK;
  31.         EXIT;
  32.     END IF;
  33.  
  34.     COMMIT;
  35.  
  36. END;


Message édité par Beegee le 04-06-2004 à 11:27:43
Reply

Marsh Posté le 04-06-2004 à 11:31:11    

oui c'est ca. Si le nombre de ligne touchée par le delete est différent du nombre total de delete dasn la procédure on fait un rollback. Mais comment récupérer ce nombre de ligne ou plutot comment faire pour tester si l'opération delete à touché une ligne ? Si je trouve ca il suffit de mettre une variable que j'incrémente à chaque suppression et je fais un test avant chaque suppression pour savoir si la précédente à marchée.

Reply

Marsh Posté le 04-06-2004 à 11:32:40    

ok merci beaucoup ! je test ca.

Reply

Marsh Posté le 04-06-2004 à 11:56:21    

Il n'accepte pas le "exit" il me dit :
" PLS-00376: instruction EXIT non autorisée ; elle doit apparaître dans une boucle"
 

Reply

Marsh Posté le 04-06-2004 à 12:11:05    

Essaye ça :
 

Code :
  1. BEGIN
  2.  
  3.     /* Suppression autorisation portail groupe */ 
  4.     Delete from T_ANN_AUT_PORTAIL_GRP 
  5.     WHERE  APG_intID_GRP = :IDGrp;
  6.     IF SQL%ROWCOUNT=0 THEN
  7.         RAISE PAS_DE_LIGNE_EFFACEE;
  8.     END IF;
  9.     /* Suppression autorisation APPLI groupe */ 
  10.     Delete from T_ANN_AUT_APPLI_GRP 
  11.     WHERE  AAG_intID_GRP = :IDGrp;
  12.     IF SQL%ROWCOUNT=0 THEN
  13.         RAISE PAS_DE_LIGNE_EFFACEE;
  14.     END IF;
  15.  
  16.     /* Suppression Groupe Collaborateur*/ 
  17.     delete from T_ANN_GRP_COL 
  18.     WHERE GRC_intID_GRP =  :IDGrp;
  19.     IF SQL%ROWCOUNT=0 THEN
  20.         RAISE PAS_DE_LIGNE_EFFACEE;
  21.     END IF;
  22.  
  23.     /*Suppression Groupe*/ 
  24.     delete from T_ANN_GROUPE 
  25.     WHERE GRP_intID =  :IDGrp;
  26.     IF SQL%ROWCOUNT=0 THEN
  27.         RAISE PAS_DE_LIGNE_EFFACEE;
  28.     END IF;
  29.     COMMIT;
  30.     EXCEPTION
  31.         WHEN PAS_DE_LIGNE_EFFACEE THEN
  32.             ROLLBACK;
  33.  
  34. END;

Reply

Marsh Posté le 04-06-2004 à 12:11:05   

Reply

Marsh Posté le 04-06-2004 à 12:26:08    

ok ca compile sans probleme. Mais est ce que si les 2 première suppressions marchent, pas la troisième et la 4ème marche : le rollback va se faire à quel moment ? Ne va t-il pas se faire avant la 4ème suppression ?

Reply

Marsh Posté le 04-06-2004 à 12:36:55    

il me semble que ça marche comme les exceptions dans tout langage : si aucune ligne n'est effacée au 3ème DELETE, alors l'exception PAS_DE_LIGNE_EFFACEE est levée, et attrapée par 'EXCEPTION WHEN ...'.
 
Donc le ROLLBACK doit se faire :)

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed