Précédent   Forum des professionnels en informatique > Bases de données > Oracle > PL/SQL
PL/SQL Forum d'entraide sur le PL/SQL
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 02/12/2004, 16h58   #1
Candidat au titre de Membre du Club
 
Inscription : décembre 2004
Messages : 60
Détails du profil
Informations forums :
Inscription : décembre 2004
Messages : 60
Points : 10
Points : 10
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 :
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
Djene est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/12/2004, 17h11   #2
Rédacteur

 
Avatar de SheikYerbouti
 
Inscription : mai 2003
Messages : 6 533
Détails du profil
Informations forums :
Inscription : mai 2003
Messages : 6 533
Points : 6 469
Points : 6 469
Dans ce cas il faut utiliser l'instruction TRANSLATE()

http://sheikyerbouti.developpez.com/pl_sql/?page=Chap3#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
SheikYerbouti est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/12/2004, 17h20   #3
Expert Confirmé
 
Homme
Chef de projet en SSII
Inscription : janvier 2004
Messages : 2 866
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 866
Points : 3 448
Points : 3 448
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/viewtopic.php?t=269648&sid=17cfc60baeef9733afe66beb490ea790

3. Que donne ceci :
Code :
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.
plaineR est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/12/2004, 18h09   #4
Candidat au titre de Membre du Club
 
Inscription : décembre 2004
Messages : 60
Détails du profil
Informations forums :
Inscription : décembre 2004
Messages : 60
Points : 10
Points : 10
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!
Djene est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/12/2004, 18h23   #5
Expert Confirmé
 
Homme
Chef de projet en SSII
Inscription : janvier 2004
Messages : 2 866
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 866
Points : 3 448
Points : 3 448
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 :
1
2
3
4
5
...
v_update := 'UPDATE '||tab.table_name||' SET '||tab.column_name||
            ' = TRANSLATE('||tab.column_name||
            ', ''&~"#{[|\"^""@"°]}¨¤£$%µ?/!§;+'',''                             '')'; 
...
ou plus joli encore :
Code :
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.
plaineR est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/12/2004, 18h33   #6
Candidat au titre de Membre du Club
 
Inscription : décembre 2004
Messages : 60
Détails du profil
Informations forums :
Inscription : décembre 2004
Messages : 60
Points : 10
Points : 10
Vous m'avez été d'une grande aide. Merci beaucoup !!!
Djene est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/12/2009, 11h11   #7
Invité de passage
 
Inscription : mars 2006
Messages : 1
Détails du profil
Informations forums :
Inscription : mars 2006
Messages : 1
Points : 1
Points : 1
Envoyer un message via MSN à bossoax Envoyer un message via Yahoo à bossoax
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
bossoax est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/12/2009, 11h23   #8
Membre confirmé
 
Avatar de mongilotti
 
Mongi
Inscription : février 2003
Messages : 298
Détails du profil
Informations personnelles :
Nom : Mongi
Localisation : Tunisie

Informations forums :
Inscription : février 2003
Messages : 298
Points : 255
Points : 255
Merci d'indiquer que ce sujet est résolu, pour qu'il soit utile pour des autres.
mongilotti est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/12/2009, 11h30   #9
Modérateur
 
Homme Fabien
Ingénieur d'études en décisionnel
Inscription : septembre 2008
Messages : 5 690
Détails du profil
Informations personnelles :
Nom : Homme Fabien
Âge : 34
Localisation : France, Yvelines (Île de France)

Informations professionnelles :
Activité : Ingénieur d'études en décisionnel
Secteur : Arts - Culture

Informations forums :
Inscription : septembre 2008
Messages : 5 690
Points : 10 450
Points : 10 450
Envoyer un message via ICQ à Waldar Envoyer un message via Skype™ à Waldar
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 !
__________________
Email : http://scr.im/waldar
Waldar 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 12h45.


 
 
 
 
Partenaires

Hébergement Web