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 SQLSERVER to FIREBIRD


Sujet :

SQL Firebird

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre habitué
    Inscrit en
    Décembre 2002
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Décembre 2002
    Messages : 13
    Par défaut Procédure SQLSERVER to FIREBIRD
    Bonjour, j'ai une procédure stockée sous SQLSERVER que je ne parviens pas à traduire vers FIREBIRD.

    Voici la procédure :

    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
     
    CREATE PROCEDURE SYSGEN
        @seq_id varchar(100),
        @res INT OUTPUT
     
        AS
            -- return an error if sequence does not exist
            -- so we will know if someone truncates the table
                set @res = -1
     
                UPDATE syssequence
                SET @res = sequence_id = sequence_id + 1
                    WHERE  seq = @seq_id
     
                    RETURN @sequence_id
    J'ai essayé de la traduire comme ceci :
    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
     
    CREATE PROCEDURE SYSGEN (
        SEQ_ID VARCHAR(30))
    RETURNS (
        RES INTEGER)
    AS
    begin
      /* Retourne -1 si la séquence n'existe pas */
      RES= -1;
     
      UPDATE "SYSSEQUENCE "
      SET RES= SEQUENCE_ID = SEQUENCE_ID + 1
      WHERE SEQ = :SEQ_ID;
     
    end
    Mais la ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    SET RES= SEQUENCE_ID = SEQUENCE_ID + 1

    Ne pase pas.

    Merci

  2. #2
    Membre Expert

    Profil pro
    Inscrit en
    Avril 2005
    Messages
    1 673
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 1 673
    Par défaut
    Le problème vient surement de la double affectation. Qu'est-ce que tu veux mettre dans la variable RES ? SEQUENCE_ID est le champ d'une table nommée SYSSEQUENCE (je propose ça parce que je ne vois pas cette variable déclarée dans ta procédure stockée) ?

  3. #3
    Membre habitué
    Inscrit en
    Décembre 2002
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Décembre 2002
    Messages : 13
    Par défaut
    Ma procédur doit me retourner le champ "SEQUENCE_ID" incrémenter de 1.

    Mais j'ai trouvé une solution :

    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
     
    CREATE PROCEDURE SYSGEN (
        SEQ_ID VARCHAR(30))
    RETURNS (
        RES INTEGER)
    AS
    begin
      /* Retourne -1 si la séquence n'existe pas */
      RES = -1;
     
      SELECT SEQUENCE_ID FROM "SYSSEQUENCE " WHERE :SEQ_ID = SEQ INTO :RES;
     
      if (RES >= 0) then begin
          RES = RES + 1;
      end
     
      UPDATE "SYSSEQUENCE "
      SET SEQUENCE_ID = :RES
      WHERE :SEQ_ID = SEQ;
     
      SUSPEND;
    end
    Mais je me demande s'il serait possible d'éviter de devoir le SELECT pour pouvoir incrémenter mon champ "SEQUENCE_ID". C'est pour cela qu'il y a une double incrémentation

  4. #4
    Membre Expert

    Profil pro
    Inscrit en
    Avril 2005
    Messages
    1 673
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 1 673
    Par défaut
    Dans le tutoriel des procédures stockées, ils parlent d'une fonction GEN_ID qui pourrait surement répondre à ta demande.

  5. #5
    Membre habitué
    Inscrit en
    Décembre 2002
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Décembre 2002
    Messages : 13
    Par défaut
    Effectivenment GEN_ID pourrait être utile, mais mon problème est que je développe actuellement une application qui doit pouvoir utiliser soit une base SQLSERVER soit une base FIREBIRD et peut être ORACLE dans le futur.

    Et pour cela que j'aimerais garder la même logique (si possible) pour les deux bases de données.

    Car (à mon avis) si je commence à utiliser des fonctions spécifiques à une seule base je vais vite avoir des problèmes de maintenance et de compatibilité. :

  6. #6
    Membre Expert

    Profil pro
    Inscrit en
    Avril 2005
    Messages
    1 673
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 1 673
    Par défaut
    Dans ce contexte, je vois pas comment faire mieux que le dernier code que tu as posté.

  7. #7
    Membre habitué
    Inscrit en
    Décembre 2002
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Décembre 2002
    Messages : 13
    Par défaut
    OK merci, je vais continuer de chercher et si je trouve une autre solution je la posterai.

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

Discussions similaires

  1. Appeler des procédures Sqlserver en Mysql
    Par Macfurp dans le forum MySQL
    Réponses: 1
    Dernier message: 18/03/2009, 20h41
  2. Migration procédures SQLSERVER => Oracle
    Par toomsounet dans le forum Outils
    Réponses: 0
    Dernier message: 20/11/2008, 14h31
  3. Comparer données 2 base SqlServer et Firebird
    Par mercure07 dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 23/04/2008, 15h17
  4. Réponses: 2
    Dernier message: 26/05/2007, 12h57
  5. Réponses: 2
    Dernier message: 19/03/2005, 17h09

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