Bonjour,
Je suis débutante et je souhaite créer un programme PL/SQL qui va rechercher dans tous les champs de type VARCHAR(X) des caractères spéciaux et les rempacer par des blancs et ceci pour 2 tables données.
C'est Urgent; merci pour vos réponses
Bonjour,
Je suis débutante et je souhaite créer un programme PL/SQL qui va rechercher dans tous les champs de type VARCHAR(X) des caractères spéciaux et les rempacer par des blancs et ceci pour 2 tables données.
C'est Urgent; merci pour vos réponses
La vue USER_TAB_COLUMNS vous donne les colonnes ainsi que le type :
faites un curseur qui récupère le nom des colonnes dont le data_type= 'VARCHAR2' et ensuite il est facile de faire un update de la table sur ces colonnes avec l'instruction REPLACE()
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 select column_name, data_type from user_tab_columns where table_name = 'NOM_DE_LA_TABLE' ;
Merci SheikYerbouti,
Simplement comment faire avec le curseur ? Les tables contiennent plus de 30 colonnes. Le curseur doit-il tous les récupérer ?
Et comment faire l'Update en utilisant le Replace ? Et pourquoi pas un TRANSLATE ?
Merci
Ca devrait ressembler à ça :
ici je supprime les chiffres :
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
18
19
20
21
22 DECLARE v_update VARCHAR2(4000); BEGIN FOR tab IN (SELECT owner,table_name FROM all_tables WHERE table_name IN ('TAB1','TAB2') LOOP v_update := 'UPDATE '||tab.owner||'.'||tab.table_name||' SET '; FOR col IN (SELECT * FROM all_tab_columns WHERE table_name = tab.table_name AND owner = tab.owner AND data_type LIKE '%CHAR%' ) LOOP v_update := v_update || col.column_name || '= TRANSLATE(' || col.column_name||',(1234567890, ),'; END LOOP; EXECUTE IMMEDIATE SUBSTR(v_update,1,LENGTH(v_update)-1); END LOOP; END; /
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 v_update := v_update || col.column_name || '= TRANSLATE(' || col.column_name||',(1234567890, ),';
Et là :
j'exécute le contenu de v_update moins le dernier caractère qui est une virgule
Code : Sélectionner tout - Visualiser dans une fenêtre à part EXECUTE IMMEDIATE SUBSTR(v_update,1,LENGTH(v_update)-1);![]()
c'est un plaisir
Merci de cliquer sur le bouton résolu si tout est OK de votre coté![]()
Ooops!
Et si c'était un REPLACE à la place du TRANSLATE ?
Et Merci pour votre patience !
Replace( 'chaine de recherche', 'chaine a remplacer', 'chaine de remplacement' )
dans votre cas, chaine de recherche est votre colonne VARCHAR
devient :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 v_update := v_update || col.column_name || '= TRANSLATE(' || col.column_name||',(1234567890, ),';
pour supprimer les @
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 v_update := v_update || col.column_name || '= REPLACE(' || col.column_name||',''@'','''')')';
'@'''
![]()
Un petit exemple pour comprendre la différence entre translate et replace :
=> replace : remplace la chaine de caracteres recherchée (ici "ol" par "12")
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 SQL> select replace ('colonne', 'ol', '12') from dual; REPLACE ------- c12onne SQL> select translate ('colonne', 'ol', '12') from dual; TRANSLA ------- c121nne
=> translate : remplace les caractères recherchés (ici "o" par "1" et "l" par "2")
N'oublie pas le tag résolu alors !![]()
Partager