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 10/05/2004, 10h04   #1
Membre confirmé
 
Avatar de TMuet
 
Homme Olivier Muet
Responsable de service informatique
Inscription : septembre 2003
Messages : 222
Détails du profil
Informations personnelles :
Nom : Homme Olivier Muet
Localisation : France

Informations professionnelles :
Activité : Responsable de service informatique
Secteur : High Tech - Multimédia et Internet

Informations forums :
Inscription : septembre 2003
Messages : 222
Points : 254
Points : 254
Par défaut [PS] Erreur à la compilation

J'ai IB 6.01 OpenSource (Delphi 7 Pro sur WinXP Pro).

Ma base de données comporte quelques Procédures Stockées.
Je compile ces PS en exécutant les commandes dans un TIBSQL (issu des IBX Delphi).

Or, lorsque j'essaie de compiler la PS suivante :
Code :
1
2
3
4
5
6
7
8
9
CREATE PROCEDURE PS_MONTEST (IN_COMPTE INTEGER) RETURNS (OUT_DISPO NUMERIC(10,2)) AS
  DECLARE VARIABLE CODE_DEV INTEGER;
  DECLARE VARIABLE MNT_SUMSOLDES NUMERIC(10,2);
BEGIN
  SELECT MNT_SOLDE,CODE_DEVISE FROM TA_COMPTE WHERE CODE_COMPTE=:IN_COMPTE INTO OUT_DISPO,CODE_DEV;
  SELECT SUM(MNT_SOLDE) FROM TA_COMPTE WHERE CODE_DEVISE=:CODE_DEV AND CODE_COMPTEPERE=:IN_COMPTE INTO MNT_SUMSOLDES;
  IF (MNT_SUMSOLDES IS NOT NULL) THEN OUT_DISPO=OUT_DISPO+MNT_SUMSOLDES;
  SUSPEND;
END;
... j'obtiens le message d'erreur suivant :
Code :
1
2
invalid request BLR at offset 173
bad parameter number
J'ai constaté qu'en retirant la ligne 6 ...
Code :
/*SELECT SUM(MNT_SOLDE) FROM TA_COMPTE WHERE CODE_DEVISE=:CODE_DEV AND CODE_COMPTEPERE=:IN_COMPTE INTO MNT_SUMSOLDES;*/
... la PS se compile sans souci

De plus, lorsque j'exécute la commande :
Code :
SELECT SUM(MNT_SOLDE) FROM TA_COMPTE WHERE CODE_DEVISE=-211 AND CODE_COMPTEPERE=13
Tout baigne 8) Ce n'est donc pas un problème de champs qui n'existent pas.
TMuet est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/05/2004, 12h11   #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
Par défaut Re: [PS] Erreur à la compilation

Bonjour,
Il est préférable (je crois que ce n'est pas obligatoire, mais fortement recommandé de mettre des : devant les variables dans les ordres SQL des PS.

[quote="TMuet"]
Code :
1
2
3
4
5
6
7
8
9
CREATE PROCEDURE PS_MONTEST (IN_COMPTE INTEGER) RETURNS (OUT_DISPO NUMERIC(10,2)) AS
  DECLARE VARIABLE CODE_DEV INTEGER;
  DECLARE VARIABLE MNT_SUMSOLDES NUMERIC(10,2);
BEGIN
  SELECT MNT_SOLDE,CODE_DEVISE FROM TA_COMPTE WHERE CODE_COMPTE=:IN_COMPTE INTO :OUT_DISPO,:CODE_DEV;
  SELECT SUM(MNT_SOLDE) FROM TA_COMPTE WHERE CODE_DEVISE=:CODE_DEV AND CODE_COMPTEPERE=:IN_COMPTE INTO :MNT_SUMSOLDES;
  IF (MNT_SUMSOLDES IS NOT NULL) THEN OUT_DISPO=OUT_DISPO+MNT_SUMSOLDES;
  SUSPEND;
END;
Je pense que le problème vient de là. En fait si c'est une variable qui ne porte pas un nom de colonne existante, je crois que ca lui pose probleme.
Moi je mets toujours les : comme préconnisé dans la doc.
Barbibulle est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/05/2004, 13h56   #3
Membre confirmé
 
Avatar de TMuet
 
Homme Olivier Muet
Responsable de service informatique
Inscription : septembre 2003
Messages : 222
Détails du profil
Informations personnelles :
Nom : Homme Olivier Muet
Localisation : France

Informations professionnelles :
Activité : Responsable de service informatique
Secteur : High Tech - Multimédia et Internet

Informations forums :
Inscription : septembre 2003
Messages : 222
Points : 254
Points : 254
J'avais bien sûr bouquiné le tutoriel des PS.
Effectivement, tous les exemples préfixent les variables avec :.
J'ai donc pris une sale habitude

Ceci dit, c'est encore pire quand je compile la fameuse PS avec les : rajoutés.
J'obtiens :
Code :
1
2
3
4
Dynamic SQL Error
SQL error code = -104
Token unknown - line 1, char 242
?
Cela correspond à la ligne 5 (les : devant la variable OUT_DISPO) :
Code :
  SELECT MNT_SOLDE,CODE_DEVISE FROM TA_COMPTE WHERE CODE_COMPTE=:IN_COMPTE INTO [b]:[/b]OUT_DISPO,:CODE_DEV;
On nage en plein délire

J'ai donc repris d'autres PS qui fonctionnent actuellement.
J'ai rajouté systématiquement les : devant les variables, recompilé et là... même message.
TMuet est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/05/2004, 14h28   #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
Je pense que votre probleme est que vous passez par le TIBSQL pour les créer.
Avez vous essayé le script dans IBConsole tout simplement ?
Code :
1
2
3
4
5
6
7
8
9
10
11
SET TERM !! ;
CREATE PROCEDURE PS_MONTEST (IN_COMPTE INTEGER) RETURNS (OUT_DISPO NUMERIC(10,2)) AS 
  DECLARE VARIABLE CODE_DEV INTEGER; 
  DECLARE VARIABLE MNT_SUMSOLDES NUMERIC(10,2); 
BEGIN 
  SELECT MNT_SOLDE,CODE_DEVISE FROM TA_COMPTE WHERE CODE_COMPTE=:IN_COMPTE INTO :OUT_DISPO,:CODE_DEV; 
  SELECT SUM(MNT_SOLDE) FROM TA_COMPTE WHERE CODE_DEVISE=:CODE_DEV AND CODE_COMPTEPERE=:IN_COMPTE INTO :MNT_SUMSOLDES; 
  IF (MNT_SUMSOLDES IS NOT NULL) THEN OUT_DISPO=OUT_DISPO+MNT_SUMSOLDES; 
  SUSPEND; 
END!!
SET TERM ; !!
Barbibulle est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/05/2004, 15h01   #5
Membre confirmé
 
Avatar de TMuet
 
Homme Olivier Muet
Responsable de service informatique
Inscription : septembre 2003
Messages : 222
Détails du profil
Informations personnelles :
Nom : Homme Olivier Muet
Localisation : France

Informations professionnelles :
Activité : Responsable de service informatique
Secteur : High Tech - Multimédia et Internet

Informations forums :
Inscription : septembre 2003
Messages : 222
Points : 254
Points : 254

Ah oui, c'est vrai que ça compile directement dans IBConsole...

Par contre, ça ne m'arrange pas trop parce que tous mes scripts de mise à jour utilisent un TIBSQL... Mais bon, je vais essayer d'en trouver la raison

Merci encore ô très grand Barbibulle.
TMuet est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/05/2004, 15h17   #6
Membre confirmé
 
Avatar de TMuet
 
Homme Olivier Muet
Responsable de service informatique
Inscription : septembre 2003
Messages : 222
Détails du profil
Informations personnelles :
Nom : Homme Olivier Muet
Localisation : France

Informations professionnelles :
Activité : Responsable de service informatique
Secteur : High Tech - Multimédia et Internet

Informations forums :
Inscription : septembre 2003
Messages : 222
Points : 254
Points : 254
Tiré de l'aide en ligne de IBConsole :
Code :
1
2
CREATE PROCEDURE
Creates a stored procedure, its input AND output parameters, AND its actions. Available IN DSQL, AND isql.
A la différence (par exemple) de :
Code :
1
2
CREATE TABLE
Creates a new TABLE IN an existing DATABASE. Available IN [b]SQL[/b], DSQL, AND isql.
Il semble que CREATE PROCEDURE ne soit pas utilisable directement en SQL
Comment on fait alors ? Je crois que je vais aller envahir le forum SQL.
TMuet est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/05/2004, 15h43   #7
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
Citation:
Envoyé par TMuet
Merci encore ô très grand Barbibulle.


Citation:
Envoyé par TMuet
Par contre, ça ne m'arrange pas trop parce que tous mes scripts de mise à jour utilisent un TIBSQL... Mais bon, je vais essayer d'en trouver la raison
(Je pense que IBSQL interprete les ordres SQL et quand il rencontre un : il croit que c'est une requete parametrée et va essayer de remplacer la variable qui suit avant l'exécution...)

Si vous ne trouvez pas comment empécher ça sachez qu'il y a d'autres moyen pour mettre à jour votre base.

Vous pouvez executer en tache de fond votre script de mise à jour en utilisant la ligne de commande d'IBConsole.

Ou si vous utilisez IBExpert (je ne sais pas si c'est inclus dans la version gratuite) vous avez un interpreteur de scrip amélioré (On peux mettre dans le script des tests comme par exemple si la table XXX existe alors ... sinon ... ). Cette editeur est exécutable en ligne de commande également.

Cette méthode offre l'avantage de ne pas être obligé de se faire un programme de mise à jour.

Sinon il reste la solution d'appeler l'API d'interbase directement... Mais là c'est pas le même niveau d'investissement temps...
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 07h23.


 
 
 
 
Partenaires

Hébergement Web