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

PL/SQL Oracle Discussion :

Certains caractères ont une taille différente de 1 ?


Sujet :

PL/SQL Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Directeur des systèmes d'information
    Inscrit en
    Août 2004
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Burkina Faso

    Informations professionnelles :
    Activité : Directeur des systèmes d'information

    Informations forums :
    Inscription : Août 2004
    Messages : 15
    Par défaut Certains caractères ont une taille différente de 1 ?
    Bonjour

    La fonction PL/SQL ci-dessous, sous Oracle, me permet de formater des caractères dans un support numérique afin d'y extirper certains caractères et permettre un alignement parfait avant impression.

    Appelée avec cette chaîne de caractère 'LIQUIDATION PRÊT ECHU', j'ai le message d'erreur suivant : ORA-06502 : PL/SQL : erreur numérique ou erreur sur une valeur: tampon de chaîne de caractères trop petit.

    Sans message d'erreur si j'essai cet ordre : select SUBSTR('LIQUIDATION PRÊT ECHU', 15 , 1) from dual


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
      FUNCTION filter_swift_char(p_in_str VARCHAR2) RETURN VARCHAR2 is
        l_SWIFTCharSet Varchar2(100)   := 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789.,- ()+/=*&%:?!"<>;~`@#$^_[]{}|';
        l_out_str      VARCHAR2(32000) := p_in_str;
        l_CharToChk    VARCHAR(1); -- le 1 doit être remplacé par 2 ou 3 pour marcher, et des fois aucune taille ne lui correspond
      BEGIN
        FOR l_inx IN 1..NVL(LENGTH(p_in_str), 0) LOOP
          l_CharToChk := SUBSTR(p_in_str, l_inx , 1);
          IF INSTR(l_SWIFTCharSet , l_CharToChk) = 0 THEN
            l_out_str := REPLACE(l_out_str, l_CharToChk);
          END IF;
        END LOOP;
        RETURN l_out_str;
      END;
    Merci de votre assistance pour comprendre et solutionner mon problème.

    Regards.

  2. #2
    McM
    McM est déconnecté
    Expert confirmé

    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Juillet 2003
    Messages
    4 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Juillet 2003
    Messages : 4 580
    Billets dans le blog
    4
    Par défaut
    Je n'ai pas de réponse à ton problème, mais tu peux utiliser le double Translate pour remplacer ta fonction (ce sera plus rapide)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT TRANSLATE(chaine,  'A'|| TRANSLATE(chaine, CHR(10) ||'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789.,- ()+/=*&%:?!"<>;~`@#$^_[]{}|', CHR(10)), 'A')
    FROM (SELECT 'LIQUIDATION PRÊT ECHU' chaine FROM dual)

  3. #3
    Membre Expert
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Avril 2013
    Messages
    2 005
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2013
    Messages : 2 005
    Par défaut
    La question est "Certains caractères ont une taille différente de 1 ? ", la réponse est oui.
    Par exemple en UTF8, le caractère ù prend 2 octets.

    Tu peux le voir en utilisant la commande lenghtB :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SQL> select length('ù'), lengthb('ù') from dual;
    LENGTH('Ù') LENGTHB('Ù')
    ----------- ------------
              1            2
    Attention, si ton sql*plus est mal configuré au niveau de la langue, tu peux avoir ce genre de résultat :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SQL> select length('ù'), lengthb('ù') from dual;
    LENGTH('??') LENGTHB('??')
    ------------ -------------
    	   2		 6
    Le premier test est fait avec sqlcl, une amélioration de sql*plus en oracle 12c, et le deuxième avec sql*plus, sur la même machine...
    Dans les deux cas, ù fait plus de un octet.

  4. #4
    Membre averti
    Homme Profil pro
    Directeur des systèmes d'information
    Inscrit en
    Août 2004
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Burkina Faso

    Informations professionnelles :
    Activité : Directeur des systèmes d'information

    Informations forums :
    Inscription : Août 2004
    Messages : 15
    Par défaut
    Citation Envoyé par McM Voir le message
    Je n'ai pas de réponse à ton problème, mais tu peux utiliser le double Translate pour remplacer ta fonction (ce sera plus rapide)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT TRANSLATE(chaine,  'A'|| TRANSLATE(chaine, CHR(10) ||'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789.,- ()+/=*&%:?!"<>;~`@#$^_[]{}|', CHR(10)), 'A')
    FROM (SELECT 'LIQUIDATION PRÊT ECHU' chaine FROM dual)
    Ca marche effectivement et très bien, merci infiniment MCm.

    Petit additif : Astuce quand ma chaîne de caractères ('LIQUIDATION PRÊT ECHU') est une variable ?

  5. #5
    McM
    McM est déconnecté
    Expert confirmé

    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Juillet 2003
    Messages
    4 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Juillet 2003
    Messages : 4 580
    Billets dans le blog
    4
    Par défaut
    Bein..

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    TRANSLATE(lavariable,  'A'|| TRANSLATE(lavariable, CHR(10) ||'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789.,- ()+/=*&%:?!"<>;~`@#$^_[]{}|', CHR(10)), 'A')

Discussions similaires

  1. Deux ensembles spécifiés dans la fonction << >> ont une dimensionalité différente.
    Par clementratel dans le forum Autres outils décisionnels
    Réponses: 0
    Dernier message: 20/02/2008, 16h15
  2. [VB 2005] Enlever certains caractères dans une textbox
    Par BluesMusic dans le forum Windows Forms
    Réponses: 4
    Dernier message: 20/01/2008, 14h14
  3. Suppression de certains caractères dans une chaine
    Par Tchupacabra dans le forum Langage
    Réponses: 2
    Dernier message: 05/12/2007, 12h08
  4. Réponses: 2
    Dernier message: 13/02/2007, 11h46
  5. Compter un certain caractère dans une chaine.
    Par illuzmax dans le forum Débuter
    Réponses: 16
    Dernier message: 07/04/2006, 16h37

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