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 :

[PS] Erreur à la compilation


Sujet :

SQL Firebird

  1. #1
    Membre actif Avatar de TMuet
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Septembre 2003
    Messages
    225
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2003
    Messages : 225
    Points : 288
    Points
    288
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    invalid request BLR at offset 173
    bad parameter number
    J'ai constaté qu'en retirant la ligne 6 ...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    /*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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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.

  2. #2
    Membre expert
    Avatar de Barbibulle
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    2 048
    Détails du profil
    Informations personnelles :
    Âge : 53
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 2 048
    Points : 3 342
    Points
    3 342
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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.

  3. #3
    Membre actif Avatar de TMuet
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Septembre 2003
    Messages
    225
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2003
    Messages : 225
    Points : 288
    Points
    288
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
      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.

  4. #4
    Membre expert
    Avatar de Barbibulle
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    2 048
    Détails du profil
    Informations personnelles :
    Âge : 53
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 2 048
    Points : 3 342
    Points
    3 342
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 ; !!

  5. #5
    Membre actif Avatar de TMuet
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Septembre 2003
    Messages
    225
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2003
    Messages : 225
    Points : 288
    Points
    288
    Par défaut

    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.

  6. #6
    Membre actif Avatar de TMuet
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Septembre 2003
    Messages
    225
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2003
    Messages : 225
    Points : 288
    Points
    288
    Par défaut
    Tiré de l'aide en ligne de IBConsole :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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.

  7. #7
    Membre expert
    Avatar de Barbibulle
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    2 048
    Détails du profil
    Informations personnelles :
    Âge : 53
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 2 048
    Points : 3 342
    Points
    3 342
    Par défaut
    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...

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

Discussions similaires

  1. Erreur de compilation après modification du Uses
    Par DevelOpeR13 dans le forum Langage
    Réponses: 5
    Dernier message: 30/10/2007, 14h23
  2. Réponses: 2
    Dernier message: 23/09/2003, 14h32
  3. Réponses: 10
    Dernier message: 22/09/2003, 21h58
  4. Réponses: 4
    Dernier message: 27/08/2003, 21h34
  5. Réponses: 2
    Dernier message: 04/03/2003, 23h24

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