Précédent   Forum des professionnels en informatique > Bases de données > Autres SGBD > InterBase
InterBase Forum d'entraide sur le SGBD InterBase de Codegear. Avant de poster -> F.A.Q Interbase, Tutoriels
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 30/09/2004, 12h48   #1
Invité de passage
 
Inscription : janvier 2004
Messages : 2
Détails du profil
Informations forums :
Inscription : janvier 2004
Messages : 2
Points : 0
Points : 0
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 :
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 :
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.
avenirdev est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/09/2004, 15h26   #2
Membre Expert
 
Avatar de Barbibulle
 
Frédéric
Inscription : octobre 2002
Messages : 1 722
Détails du profil
Informations personnelles :
Nom : Frédéric
Âge : 42

Informations forums :
Inscription : octobre 2002
Messages : 1 722
Points : 2 025
Points : 2 025
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.
Barbibulle est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/10/2004, 09h49   #3
Invité de passage
 
Inscription : janvier 2004
Messages : 2
Détails du profil
Informations forums :
Inscription : janvier 2004
Messages : 2
Points : 0
Points : 0
ok, merci Barbibulle pour les explications. Je retourne de ce pas dans mon code !
avenirdev est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 04h53.


 
 
 
 
Partenaires

Hébergement Web