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

Firebird Discussion :

Petite bizarrerie avec SUBSTRING


Sujet :

Firebird

  1. #1
    Membre expérimenté
    Homme Profil pro
    Ingenieur de recherche - Ecologue
    Inscrit en
    Juin 2003
    Messages
    1 146
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingenieur de recherche - Ecologue

    Informations forums :
    Inscription : Juin 2003
    Messages : 1 146
    Points : 1 412
    Points
    1 412
    Par défaut Petite bizarrerie avec SUBSTRING
    Bonjour à tous

    J'ai une requête de ce type :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    SELECT Table.Col1
      FROM Table
      WHERE Table.Col2 = SUBSTRING(:Param FROM 1 FOR 20)
    où Table.Col2 est un VARCHAR(20)
    et Param un VARCHAR(200)

    Syntaxiquement c'est bon, non ?
    Si :param = 'aaaaaa' (moins de 20 caractères)
    mais si :param contient plus de 20 caractères, je reçois l'erreur :
    Incompatible column/host variable data type.
    Dynamic SQL Error.
    SQL error code = -303.
    arithmetic exception, numeric overflow, or string truncation.
    string right truncation.
    Par contre si je remplace :param par la chaine de caractères :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    SELECT FIRST 1 Table.Col1
      FROM Table
      WHERE Table.Col2 = SUBSTRING('aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa' FROM 1 FOR 20)
    Ca fonctionne. Est normal qu'en affectant un paramètre cela ne fonctionne plus ?


    et si oui, je connais la solution. Je vais devoir :
    *soit créer une variable intermédiaire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Chaine1 = SUBSTRING(:param FROM 1 TO 20);
    SELECT FIRST 1 Table.Col1
      FROM Table
      WHERE Table.Col2 = :Chaine1
    INTO :blabla
    ....
    Soit utilisez un EXECUTE STATEMENT :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    EXECUTE STATEMENT 'SELECT FIRST 1 Table.Col1
                                         FROM Table
                                          WHERE Table.Col2 = ''' || SUBSTRING(:param FROM 1 FOR 20) || '''';
    INTO :blabla
    Merci d'ajouter un sur les tags qui vous ont aidé

  2. #2
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 042
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 042
    Points : 40 952
    Points
    40 952
    Billets dans le blog
    62
    Par défaut
    Bonjour,

    as-tu essayé en castant le paramètre ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT LIBELLE_APPOSE
      FROM APPOSE
      WHERE LIBELLE_APPOSE = SUBSTRING(CAST(:Param AS VARCHAR(200)) FROM 1 FOR 20)
    mais encore, plus simple changer le where
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
      WHERE SUBSTRING(:Param  FROM 1 FOR 20) = Table.Col2


    Serge
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    245
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 245
    Points : 534
    Points
    534
    Par défaut
    Bonsoir,

    Chez moi seule la première forme avec le cast fonctionne, pas la deuxième.
    Sans le cast, tout se passe comme si Firebird ignorant le type de :param considère qu'il est le même que le type du champ col2.

    André

  4. #4
    Membre expérimenté
    Homme Profil pro
    Ingenieur de recherche - Ecologue
    Inscrit en
    Juin 2003
    Messages
    1 146
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingenieur de recherche - Ecologue

    Informations forums :
    Inscription : Juin 2003
    Messages : 1 146
    Points : 1 412
    Points
    1 412
    Par défaut
    Bonjour et merci

    Je n'avais pas pensé au castage Merci Sergio

    Par contre pas sous cette forme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    WHERE LIBELLE_APPOSE = SUBSTRING(CAST(:Param AS VARCHAR(200)) FROM 1 FOR 20)
    mais sous celle-ci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    WHERE LIBELLE_APPOSE = CAST(SUBSTRING(:Param FROM 1 FOR 20) AS VARCHAR(20))  -- Et 20 au lieu de 200 ;)
    La deuxième forme proposait me fonctionne non plus chez moi (je suis sous FIREBIRD 2.5.4 - la toute dernière)

    Mais c'est quand même curieux que cette forme
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    WHERE LIBELLE_APPOSE = SUBSTRING(:Param FROM 1 FOR 20)
    ne fonctionne pas lorsque la valeur contenu dans param dépasse les limites de LIBELLE_APPOSE (20 caractères ici), mais fonctionne lorsque celle-ci est inférieure à cette taille !???

    A+

    olivier
    Merci d'ajouter un sur les tags qui vous ont aidé

  5. #5
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 042
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 042
    Points : 40 952
    Points
    40 952
    Billets dans le blog
    62
    Par défaut
    Bonjour,

    Heureux que tu ais trouvé une solution, à ma petite honte (faute de temps) je n'avais pas pu vérifier l'ordre du CAST

    Mais c'est quand même curieux que cette forme
    WHERE LIBELLE_APPOSE = SUBSTRING(aram FROM 1 FOR 20)
    ne fonctionne pas lorsque la valeur contenu dans param dépasse les limites de LIBELLE_APPOSE (20 caractères ici), mais fonctionne lorsque celle-ci est inférieure à cette taille
    je crois que c'est à cause de l'interpréteur qui suppose (pas totalement à tort d'ailleurs) que on ne pourrait pas comparer une chaine plus longue qu'une autre, param est donc limité "automatiquement dans sa taille" à la taille maxi du champ, le substring n'étant évalué qu'après (c'est peut être là où ça blesse) le CAST permettant alors d'y remédier.
    Quant à la forme, ta correction plutôt que celle que j'avais proposé au départ, cela doit encore dépendre de l'ordre des opérateurs
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  6. #6
    Membre expérimenté
    Homme Profil pro
    Ingenieur de recherche - Ecologue
    Inscrit en
    Juin 2003
    Messages
    1 146
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingenieur de recherche - Ecologue

    Informations forums :
    Inscription : Juin 2003
    Messages : 1 146
    Points : 1 412
    Points
    1 412
    Par défaut
    Citation Envoyé par SergioMaster Voir le message
    Quant à la forme, ta correction plutôt que celle que j'avais proposé au départ, cela doit encore dépendre de l'ordre des opérateurs
    Je ne comprend pas

    Peut être que Philippe M. en dira plus

    Merci encore

    Olivier
    Merci d'ajouter un sur les tags qui vous ont aidé

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

Discussions similaires

  1. [TP]petit probleme avec solution
    Par pompompolom dans le forum Turbo Pascal
    Réponses: 1
    Dernier message: 02/12/2004, 19h48
  2. petit probleme avec l'éditeur de builder
    Par qZheneton dans le forum C++Builder
    Réponses: 2
    Dernier message: 28/10/2004, 16h19
  3. [CVS] Petits déboires avec JBuilder9 et CVS
    Par Marc_P dans le forum JBuilder
    Réponses: 2
    Dernier message: 19/02/2004, 09h35
  4. [DEBUTANT] petits soucis avec un prgm de chat
    Par LechucK dans le forum MFC
    Réponses: 8
    Dernier message: 19/01/2004, 16h52
  5. [debutant] pour debbuger un petit prog avec menu
    Par niluge01 dans le forum Windows
    Réponses: 3
    Dernier message: 22/11/2003, 14h03

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