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

SQL Firebird Discussion :

procédure stockée trigger et exception avec delphi et IB6 OS


Sujet :

SQL Firebird

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Février 2004
    Messages
    251
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 251
    Points : 118
    Points
    118
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : 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
     
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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+

    windows 10 / DEBIAN 7.9 / Etc...

  2. #2
    Membre du Club
    Inscrit en
    Juillet 2002
    Messages
    197
    Détails du profil
    Informations forums :
    Inscription : Juillet 2002
    Messages : 197
    Points : 54
    Points
    54
    Par défaut
    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 : 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
     
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Février 2004
    Messages
    251
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 251
    Points : 118
    Points
    118
    Par défaut

    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+

    windows 10 / DEBIAN 7.9 / Etc...

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

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Procédures stockées SQL Server, récupération sous Delphi
    Par rophi dans le forum Bases de données
    Réponses: 10
    Dernier message: 03/12/2007, 14h48
  2. [Procédure Stockée] Comment la constuire avec un cursor?
    Par Portekoi dans le forum MS SQL Server
    Réponses: 6
    Dernier message: 21/03/2006, 16h22
  3. Procédures stockées SQL Server compatibles avec MySQL ?
    Par Nen'S dans le forum SQL Procédural
    Réponses: 2
    Dernier message: 24/01/2006, 19h18
  4. Procédures stockées, Trigger et variables internes
    Par lio33 dans le forum InterBase
    Réponses: 1
    Dernier message: 01/09/2005, 10h28
  5. [Comparatif] Procédures stockées, triggers, etc.
    Par MCZz dans le forum Décisions SGBD
    Réponses: 3
    Dernier message: 28/08/2002, 12h27

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