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 :

Utilisation de REPLACE() dans un programme PL/SQL


Sujet :

PL/SQL Oracle

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    132
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Décembre 2004
    Messages : 132
    Points : 69
    Points
    69
    Par défaut Utilisation de REPLACE() dans un programme PL/SQL
    Bonjour,

    Le programme ci-dessous doit rechercher des caractères spéciaux suivant (&~"#{[|\"^""@"°]}¨¤£$%µ?/!§;+) dans les colonnes d'une table et les remplacer par des blancs le cas échéant.
    Lorsque je l'exécute, j'ai l'erreur suivante :

    ORA-01741: illegal zero-length identifier


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    DECLARE
    v_update VARCHAR2(4000);
    BEGIN      
    FOR tab IN (SELECT table_name, column_name 
                    FROM cols 
                 WHERE table_name = 'TESTELISA'
                    AND data_type LIKE '%CHAR%'
                ) 
    LOOP
    v_update := 'UPDATE '||tab.table_name||' SET '||tab.column_name||' = 
                 REPLACE('||tab.column_name||', '&~"#{[|\"^""@"°]}¨¤£$%µ?/!§;+', '')';
     
    EXECUTE IMMEDIATE v_update;
    END LOOP;
    END;
    Comment faire ?

    Balise code ajoutées par Orafrance, merci d'y penser à l'avenir

  2. #2
    Expert éminent sénior
    Avatar de SheikYerbouti
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    6 760
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 6 760
    Points : 11 862
    Points
    11 862
    Par défaut
    Dans ce cas il faut utiliser l'instruction TRANSLATE()

    http://sheikyerbouti.developpez.com/...hap3#TRANSLATE
    Rédacteur Oracle (Oracle ACE)
    Guide Oracle ,Guide PL/SQL, Guide Forms 9i/10g, Index de recherche
    Je ne réponds pas aux questions techniques par MP
    Blogs: Forms-PL/SQL-J2EE - Forms Java Beans

  3. #3
    Membre expert

    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Janvier 2004
    Messages
    2 862
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 862
    Points : 3 609
    Points
    3 609
    Par défaut
    1. Merci d'utiliser les balises codes pour plus de lisibilité

    2. Si l'objectif est de supprimer chaque caractère compris dans ta deuxième chaine de caractères, il faut utiliser TRANSLATE, REPLACE ne marchera pas dans ce cas, voir le post suivant :
    http://www.developpez.net/forums/vie...e66beb490ea790

    3. Que donne ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    DECLARE 
    v_update VARCHAR2(4000); 
    BEGIN 
    FOR tab IN (SELECT table_name, column_name 
    FROM cols 
    WHERE table_name = 'TESTELISA' 
    AND data_type LIKE '%CHAR%' 
    ) 
    LOOP 
    v_update := 'UPDATE '||tab.table_name||' SET '||tab.column_name||
                ' = TRANSLATE('||tab.column_name||
                ', '' &~"#{[|\"^""@"°]}¨¤£$%µ?/!§;+'', '' '')'; 
    EXECUTE IMMEDIATE v_update; 
    END LOOP; 
    END;
    Un problème sans solution est un problème mal posé

    Merci de poser vos questions sur le forum, je ne réponds pas aux questions posées par MP.

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    132
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Décembre 2004
    Messages : 132
    Points : 69
    Points
    69
    Par défaut
    Merci beaucoup pour votre aide.

    TRANSLATE() fonctionne.

    Simplement, la colonne qui contenait les caractères spéciaux :

    RUE%RAYMOND£§LOSSERAND!

    est obtenue sous la forme : RUERAYMONDLOSSERAND

    alors que je souhaiterai le résultat sous la Forme :

    RUE RAYMOND LOSSERAND

    Je suis désolée et je m'excuse pour les balises codes !! Mais comment les utilise-t-on ?

    Merci!

  5. #5
    Membre expert

    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Janvier 2004
    Messages
    2 862
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 862
    Points : 3 609
    Points
    3 609
    Par défaut
    Puisque translate remplace chaque caractere par la valeur que tu as choisie, si tu veux des espaces il faut mettre autant d'espace que tu as de caractères dans ta chaine.

    Ton code devient donc :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    ...
    v_update := 'UPDATE '||tab.table_name||' SET '||tab.column_name||
                ' = TRANSLATE('||tab.column_name||
                ', ''&~"#{[|\"^""@"°]}¨¤£$%µ?/!§;+'',''                             '')'; 
    ...
    ou plus joli encore :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    DECLARE 
    v_update VARCHAR2(4000); 
    v_chaine varchar2(100);
    BEGIN 
    v_chaine := '&~"#{[|\"^""@"°]}¨¤£$%µ?/!§;+';
    FOR tab IN (SELECT table_name, column_name 
    FROM cols 
    WHERE table_name = 'TESTELISA' 
    AND data_type LIKE '%CHAR%' 
    ) 
    LOOP 
    v_update := 'UPDATE '||tab.table_name||' SET '||tab.column_name||
                ' = TRANSLATE('||tab.column_name|| ', ''' || v_chaine || ''',''' ||
                lpad (' ', length (v_chaine), ' '), ''')';
    EXECUTE IMMEDIATE v_update; 
    END LOOP; 
    END;
    Pour l'utilisation des balises code, sélectionne la partie de ton texte qui correspond au code et clique sur le bouton code, et le tour est joué !
    Un problème sans solution est un problème mal posé

    Merci de poser vos questions sur le forum, je ne réponds pas aux questions posées par MP.

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    132
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Décembre 2004
    Messages : 132
    Points : 69
    Points
    69
    Par défaut
    Vous m'avez été d'une grande aide. Merci beaucoup !!!

  7. #7
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 2
    Points : 5
    Points
    5
    Par défaut Reprise
    J'ai repris le code écrit ci dessus pour faire un translate d'un champ erroné dans toute une base.
    Merci

  8. #8
    Membre averti Avatar de mongilotti
    Profil pro
    Inscrit en
    Février 2003
    Messages
    314
    Détails du profil
    Informations personnelles :
    Localisation : Tunisie

    Informations forums :
    Inscription : Février 2003
    Messages : 314
    Points : 303
    Points
    303
    Par défaut
    Merci d'indiquer que ce sujet est résolu, pour qu'il soit utile pour des autres.

  9. #9
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Customer Success Manager @Vertica
    Inscrit en
    Septembre 2008
    Messages
    8 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Customer Success Manager @Vertica
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 452
    Points : 17 820
    Points
    17 820
    Par défaut
    Citation Envoyé par mongilotti Voir le message
    Merci d'indiquer que ce sujet est résolu, pour qu'il soit utile pour des autres.
    Plus que 20.000 sujets à commenter pour ne rien dire, courage !

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

Discussions similaires

  1. utilisation de zlib dans un programme c
    Par kim31 dans le forum C
    Réponses: 2
    Dernier message: 31/08/2006, 12h05
  2. Réponses: 1
    Dernier message: 30/07/2006, 02h35
  3. utiliser fichier XML dans un programme C++
    Par ilimo dans le forum Bibliothèques
    Réponses: 1
    Dernier message: 13/04/2006, 11h42
  4. utilisation de zlib dans un programme c/c++
    Par romzaide dans le forum Bibliothèques
    Réponses: 6
    Dernier message: 27/05/2005, 14h57
  5. Utilisation de replace dans champs text
    Par cdelamarre dans le forum PostgreSQL
    Réponses: 5
    Dernier message: 01/12/2004, 17h26

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