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 03/06/2005, 09h32   #1
Invité régulier
 
Inscription : décembre 2002
Messages : 13
Détails du profil
Informations forums :
Inscription : décembre 2002
Messages : 13
Points : 9
Points : 9
Envoyer un message via MSN à tiennos
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 :
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 :
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 :
1
2
 
SET RES= SEQUENCE_ID = SEQUENCE_ID + 1

Ne pase pas.

Merci
tiennos est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/06/2005, 12h59   #2
Membre Expert
 
Inscription : avril 2005
Messages : 1 672
Détails du profil
Informations forums :
Inscription : avril 2005
Messages : 1 672
Points : 1 337
Points : 1 337
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) ?
Magnus est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/06/2005, 13h33   #3
Invité régulier
 
Inscription : décembre 2002
Messages : 13
Détails du profil
Informations forums :
Inscription : décembre 2002
Messages : 13
Points : 9
Points : 9
Envoyer un message via MSN à tiennos
Ma procédur doit me retourner le champ "SEQUENCE_ID" incrémenter de 1.

Mais j'ai trouvé une solution :

Code :
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
tiennos est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/06/2005, 15h28   #4
Membre Expert
 
Inscription : avril 2005
Messages : 1 672
Détails du profil
Informations forums :
Inscription : avril 2005
Messages : 1 672
Points : 1 337
Points : 1 337
Dans le tutoriel des procédures stockées, ils parlent d'une fonction GEN_ID qui pourrait surement répondre à ta demande.
Magnus est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/06/2005, 15h39   #5
Invité régulier
 
Inscription : décembre 2002
Messages : 13
Détails du profil
Informations forums :
Inscription : décembre 2002
Messages : 13
Points : 9
Points : 9
Envoyer un message via MSN à tiennos
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é. :
tiennos est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/06/2005, 15h48   #6
Membre Expert
 
Inscription : avril 2005
Messages : 1 672
Détails du profil
Informations forums :
Inscription : avril 2005
Messages : 1 672
Points : 1 337
Points : 1 337
Dans ce contexte, je vois pas comment faire mieux que le dernier code que tu as posté.
Magnus est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/06/2005, 15h51   #7
Invité régulier
 
Inscription : décembre 2002
Messages : 13
Détails du profil
Informations forums :
Inscription : décembre 2002
Messages : 13
Points : 9
Points : 9
Envoyer un message via MSN à tiennos
OK merci, je vais continuer de chercher et si je trouve une autre solution je la posterai.
tiennos 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 12h25.


 
 
 
 
Partenaires

Hébergement Web