Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1620 connectés 

  FORUM HardWare.fr
  Programmation
  SQL/NoSQL

  Pb sous PL/SQL : correspondance de Transaction ?

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Pb sous PL/SQL : correspondance de Transaction ?

n°751164
petithomme
Posté le 03-06-2004 à 17:46:49  profilanswer
 

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.

mood
Publicité
Posté le 03-06-2004 à 17:46:49  profilanswer
 

n°751951
Beegee
Posté le 04-06-2004 à 08:55:37  profilanswer
 

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.

n°751953
Beegee
Posté le 04-06-2004 à 08:57:08  profilanswer
 

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
n°752059
petithomme
Posté le 04-06-2004 à 10:05:32  profilanswer
 

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 ...

n°752233
Beegee
Posté le 04-06-2004 à 11:21:45  profilanswer
 

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.

n°752250
Beegee
Posté le 04-06-2004 à 11:26:41  profilanswer
 

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
n°752261
petithomme
Posté le 04-06-2004 à 11:31:11  profilanswer
 

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.

n°752265
petithomme
Posté le 04-06-2004 à 11:32:40  profilanswer
 

ok merci beaucoup ! je test ca.

n°752351
petithomme
Posté le 04-06-2004 à 11:56:21  profilanswer
 

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

n°752371
Beegee
Posté le 04-06-2004 à 12:11:05  profilanswer
 

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;

mood
Publicité
Posté le 04-06-2004 à 12:11:05  profilanswer
 

n°752397
petithomme
Posté le 04-06-2004 à 12:26:08  profilanswer
 

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 ?

n°752408
Beegee
Posté le 04-06-2004 à 12:36:55  profilanswer
 

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 :)


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  SQL/NoSQL

  Pb sous PL/SQL : correspondance de Transaction ?

 

Sujets relatifs
Pb sous PL/SQL : Affectation d'une valeur à une variable[SQL] UPDATE complexe
Recherche correpondance SQL Server / Oracle[C++] Comment se connecter à un serveur SQL via c++
Rafraichissé moi la memoire, requete sqlÉnigme avec SQL !!
[PL/SQL] Problème de transfert de tablePb de requete sql dans une page php.
De Acces à SQL server: problème de requête Helpppppppppppp!!![SQL Server] Requete imbriquée et retour des X premiers enregistrement
Plus de sujets relatifs à : Pb sous PL/SQL : correspondance de Transaction ?


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR