IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

InterBase Discussion :

Pb de Commit dans une Procedure stoquée


Sujet :

InterBase

  1. #1
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2
    Points : 1
    Points
    1
    Par défaut Pb de Commit dans une Procedure stoquée
    Bonjour à tous,
    Après avoir épluché les 19 pages de post sans résultat , je me résous a quémander de l'aide !
    Alors voila mon problème : je veux créer une procédure stoquée dans Interbase qui insère des lignes dans une table (jusqu'ici tout va bien), mais la boucle d'insertion utilise les valeurs d'une deuxième procedure qui va lire dans la meme table. Ce qui fait que les lignes qui sont en train d'être insérées par la procedure 1 ne sont pas prises en comptes par la 2 (euh, je suis clair la ?). Donc en gros mon problème c'est de pouvoir faire un commit à l'interieur d'une procedure stoquée.

    je mets les codes des procedures a tout hasard !
    Proc1 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    create procedure PROC1 (VALPOINT decimal(15,2))
    returns (NB_MAJ integer)
    as
     declare variable CLI integer;
     declare variable CDE integer;
     declare variable PAYE decimal(15,2);
     declare variable COMPT integer;
     declare variable TOT integer;
    begin
        NB_MAJ = 0;
        for
            select LECLI, LACOM, HT_PAYE
            from DONNE_LISTE_FACT_POINTS
            into :CLI, :CDE, :PAYE
        do
        begin
           if (PAYE is not null)
           then
           begin
              select count(ID)
              from POINTS_MVMT
              where (IDCLI = :CLI) and (IDCDE = :CDE)
              into :COMPT;
     
              if (:COMPT = 0)
              then
              begin
                  TOT = 0;
                  select LESOLDE
                  from PROC2(:CLI)
                  into :TOT;
     
                  insert into POINTS_MVMT (IDCLI, IDCDE, DATE_MVT, LIBELLE, HT, POINTS, SOLDE)
                  select :CLI, :CDE, COMMANDE.DATEPAY, COMMANDE.CHRONOFACT, :PAYE, :VALPOINT*:PAYE, :TOT
                  from COMMANDE
                  where COMMANDE.ID = :CDE;
     
                  NB_MAJ = :NB_MAJ+1;
              end
              suspend;
           end
        end
    end^
    et la 2eme proc :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    create procedure DONNE_SOLDE_POINTS (CLI integer)
    returns (LESOLDE integer)
    as
    begin
      select SOLDE
      from POINTS_MVMT
      where ID = (select MAX(ID) from POINTS_MVMT where IDCLI=:CLI)
      into :LESOLDE;
    end^
    Voila, merci d'avance pour toute aide !
    Jerome.

  2. #2
    Membre expert
    Avatar de Barbibulle
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    2 048
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 2 048
    Points : 3 342
    Points
    3 342
    Par défaut
    On ne peux pas sous interbase faire un commit de transaction dans une PS.
    Pourquoi ?

    Le principe est simple, c'est l'application cliente qui doit décider de l'annulation ou la validation de la transaction. Et c'est plus simple et naturel ainsi. Immaginons que vous fassiez 10 000 insert depuis votre application cliente, puis vous lanciez une PS qui effectue un traitement qui peut etre relancé unitairement. Si cette PS avait la possibilité de valider ou d'annuler la transaction ca serait un peu dangereux, et il ne servirait à rien de demander à l'utilisateur final s'il veux valider ou annuler les 10000 insert... Bref ca compliquerait les choses apres pour savoir si c'est la PS ou le client qui valide ou annule etc... C'est bien plus simple comme c'est.
    Dans une transaction je peux combiner tous les traitement que je veux et les annuler ou valider en bloque sans me poser la question si un des traitements que j'ai pu appelé a déjà annulé ou validé...

    Par contre dans un PS on peux lever une exception ce qui permet d'annuler le traitement en cours et surtout d'informer le client qu'il y a un probleme. Ce client décidera s'il doit annuler ou valider sa transaction.

    Bon je ne suis pas certain d'avoir été clair et je n'ai pas le temps de me relire.

    Pour en revenir à votre probleme, comment votre deuxième procédure peut elle prendre en compte un insert que vous faites après son appel ??? Ne serait ce pas là votre problème ? Car vos deux PS étant dans le même transaction (puisqu'une appelle l'autre...) les modifications faites par l'une sont visibles par les deux.

    Faites l'appel apres votre insert et celui ci sera pris en compte par votre PS appelée.

  3. #3
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2
    Points : 1
    Points
    1
    Par défaut
    ok, merci Barbibulle pour les explications. Je retourne de ce pas dans mon code !

Discussions similaires

  1. Réponses: 6
    Dernier message: 05/08/2004, 13h15
  2. Probleme dans une procedure stockée
    Par malbaladejo dans le forum MS SQL Server
    Réponses: 5
    Dernier message: 07/07/2004, 14h08
  3. [DEBUTANT] Une vue dans une procedure stockee ?
    Par Invité dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 25/02/2004, 11h57
  4. Réponses: 4
    Dernier message: 28/12/2003, 15h50
  5. [TP]code asm dans une procedure
    Par M.Dlb dans le forum Turbo Pascal
    Réponses: 3
    Dernier message: 17/08/2002, 20h43

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo