Précédent   Forum des professionnels en informatique > Bases de données > Firebird > SQL
SQL Forum d'entraide sur le SQL pour Firebird
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 09/11/2004, 02h34   #1
Membre du Club
 
Inscription : février 2004
Messages : 166
Détails du profil
Informations forums :
Inscription : février 2004
Messages : 166
Points : 67
Points : 67
Par défaut procédure stockée trigger et exception avec delphi et IB6 OS


slt

voila j'ai une table IB composé d'une clé IDREGION et d'un champ NOMREGION de type caractère.
J'ai écrit un trigger sur cette table, qui incrémente la clé pour chaque nouveau insert.
Code :
1
2
3
4
5
6
7
 
CREATE TRIGGER TRG_CLE FOR TABLE_REGION ACTIVE  BEFORE INSERT  POSITION 0
AS
begin
 IF (new.IDREGION IS NULL) then
    NEW.IDREGION=GEN_ID(GEN_CLE,1);
end
j'ai écrit l'exception
Code :
1
2
 
CREATE exception COUCOU 'Impossible';
J'ai écrit une procédure stockée qui insère la valeur pour le champ NOMREGION, et qui lève une exception lorsque le champ NOMREGION est dupliqué.
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
 
CREATE PROCEDURE ADD_REGION (
  NOMREGION char(50))
RETURNS(
  ESSAI char(50))
AS
DECLARE variable test integer;
begin
  test=0;
  SELECT IdREgion 
  FROM Table_Region 
  WHERENomRegion=:NomRegion 
  INTO:test;
  IF (test<>0) then
    begin
        EXCEPTION coucou;
   end
   INSERT INTO Table_Region (NomRegion) VALUES (:NomREgion);
   suspend;
end
********************************************
Dans DELPHI STD4 j'exécute la procédure stockée:
Code :
1
2
3
4
5
6
7
8
9
10
11
 
procedure TForm1.Button1Click(Sender: TObject);
begin
 MaTable.Active:=false;
 maproc.ParamByName('NOMREGION').asString:=edit1.Text;
 Maproc.Prepare;
  matrans.StartTransaction;
  maproc.ExecProc;
  matrans.Commit;
 MaTable.Active:=True;
end;
***************************************
Quand le champ NOMREGION n'est pas dupliqué, mon insert fonctionne bien.
Quand j'essais de dupliquer une valeur pour NOMREGION, l'exception est lévé, mon application delphi affiche ds une fenètre :

exception 1079524496
.
exception1.
Impossible

Ma question est la suivante : pourquoi le message d'erreur n'est pas tout simplement : "impossible" ?

Nb : je pense que vous aller me poser la question suivante:
Pourquoi ne pas mettre la clé sur le champ NOMREGION ?
Ma réponse est : parce que je pense qu'une recherche sur un champ de type integer est plus rapide qu(une recherche sur un champ de type caractere de 50 !
Ai je raison ?
Merci
a+
CharleLéo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/11/2004, 13h22   #2
Membre à l'essai
 
Inscription : juillet 2002
Messages : 190
Détails du profil
Informations forums :
Inscription : juillet 2002
Messages : 190
Points : 22
Points : 22
Citation:
parce que je pense qu'une recherche sur un champ de type integer est plus rapide qu(une recherche sur un champ de type caractere de 50 !
je crois que tu as parfaitement raison.
Pour ce qui est de la gesion de duplication de nomderegion tu n'as pas besoin de gerer ça avec une exception. voici un exemple:
dans IB
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
 
CREATE PROCEDURE ADD_REGION ( 
  NOMREGION char(50)) 
RETURNS( 
  ESSAI integer) 
AS 
DECLARE variable test integer; 
begin 
  test=0; 
  SELECT IdREgion 
  FROM Table_Region 
  WHERENomRegion=:NomRegion 
  INTO:test; 
  IF (test=0) then 
   begin 
        INSERT INTO Table_Region (NomRegion) VALUES (:NomREgion);
        essai=1;
   end else
        essai=0;
   suspend; 
end
dans delphi:

Code :
1
2
3
4
5
6
7
8
9
10
11
12
 
procedure TForm1.Button1Click(Sender: TObject);
var test : integer; 
begin 
  maproc.ParamByName('NOMREGION').asString:=edit1.Text; 
  matrans.StartTransaction; 
  maproc.ExecProc; 
  matrans.Commit; 
  test=maproc.ParamByName('essai');
  IF test=0 then
     showmessage('impossible')
end;
Esperant que ça poura t'aider.
cordialement
toure32 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/11/2004, 14h20   #3
Membre du Club
 
Inscription : février 2004
Messages : 166
Détails du profil
Informations forums :
Inscription : février 2004
Messages : 166
Points : 67
Points : 67

slt

Ok c'est une solution sympa ! Merci.

Autre question : en c/s , ne vaut il pas mieux faire les transactions ds les procédures stockées que dans delphi ?

a+
CharleLéo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/11/2004, 14h43   #4
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
Delphi ne crée pas de transaction.
De même que sous interbase6 on ne peut pas gérer les transactions dans une PS.

Les transacions sont entièrement gérées sur le serveur. Le client (l'application Delphi dans votre cas) ne fait que demander au serveur :
l'ouverture (création) d'une transaction.
puis pour chaque exécution d'un ou plusieurs ordres SQL ou PS, on doit spécifier dans quel transaction l'effectuer.
et enfin la fermeture (validante avec un commit ou annulante avec un rollback) de la transaction.
Barbibulle est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 05h33.


 
 
 
 
Partenaires

Hébergement Web