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 03/03/2008, 14h28   #1
Invité de passage
 
Inscription : février 2008
Messages : 3
Détails du profil
Informations forums :
Inscription : février 2008
Messages : 3
Points : 1
Points : 1
Par défaut PL/SQL requete sql

Bonjour,

Je souhaite faire une requête dont l'objet est d'insérer des données dans une table X avec 11 champs à partir d'un select de 14 champs de 6 tables. Pour ce faire, j'ai concaténé 4 champs des 14 champs pour en faire que 11.
Voici la requete :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
INSERT INTO TABLE_X (A, B, C, 
D,E, F, G, H, I,
J, FUSION_K_L_E_F)
SELECT 	TABLE_W.A,
	TABLE_S.B,
	TABLE_T.C,
	TABLE_U.D,
	TABLE_V.E,
	TABLE_V.F,
	TABLE_V.G,
	TABLE_R.H,
	TABLE_W.I,
	TABLE_S.J,
	TABLE_T.K|| 
	TABLE_U.L|| _ ||
	TABLE_V.E|| _ ||
	TABLE_V.F
		
FROM TABLE_R,TABLE_S,TABLE_T,TABLE_U,TABLE_V,TABLE_W 

WHERE TABLE_R.SS_CLE=TABLE_W.SS_CLE
AND TABLE_S.AA_CLE = TABLE_W.AA_CLE 
AND TABLE_V.SI_CLE = TABLE_S.SI_CLE 
AND TABLE_V.DD_CLE=TABLE_T.DD_CLE 
AND TABLE_V.CC_CLE=TABLE_U.CC_CLE ;
Par rapport à cette requête, comment pourrais-je en pl/sql ou autre, tester le dernier champs (en rouge), parceque je vais récupérer lors de mon select des valeurs de type string <=5 charactères par exemple : (1, 54, 333, 1290, 52a ou encore 216a. Or je souhaiterai d'une part supprimer la dernière lettre et en plus que toutes la valeurs soient sur 4 charactères en mettant un "0" avant le nombre par exemple : (au lieu de 1 avoir 0001, au lieu de 54 avoir 0054, au lieu de 216a avoir 0216).
Bref je ne sais pas comment je pourrais faire cela en pl/sql, quelqu'un a t'il une piste?
Merci pour votre aide.
kantor est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/03/2008, 15h55   #2
McM
Expert Confirmé Sénior
 
Inscription : juillet 2003
Messages : 3 459
Détails du profil
Informations forums :
Inscription : juillet 2003
Messages : 3 459
Points : 4 226
Points : 4 226
Pour supprimer la dernière lettre :
si ce n'est qu'un lettre:
ASCII(SUBSTR(v_chaine, LENGTH(v_chaine))) : vérifier si c'est entre 48 et 57

pour forcer sur 4 caractères avec des 0 à gauche : LPAD(chaine, 4, '0')
Attention si chaine est NULL, ça renvoie NULL, donc faire un NVL(chaine, '0')
__________________
More Code : More Bugs. Less Code : Less Bugs
McM est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/03/2008, 15h57   #3
Membre émérite
 
Avatar de Drizzt [Drone38]
 
Homme
Inscription : mai 2004
Messages : 739
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 29
Localisation : France, Isère (Rhône Alpes)

Informations forums :
Inscription : mai 2004
Messages : 739
Points : 979
Points : 979
Si j'ai bien compris dans tes exemples tu voudrais :
1, --> 0001
54 --> 0054
333 --> 0333
1290 --> 1290
52a --> 0052
216a --> 0216

C'est ça ?
Si la dernière lettre est obligatoirement 'a', tu peux t'en sortir avec des decode et substr.

Ensuite pour ajouter les 0 un LPAD fera l'affaire.

Avec ça par exemple :
Code :
SELECT lpad(decode(substr('52a',-1),'a',substr('52a',1,INSTR('52a','a')-1)),4,'0')
Il va te renvoyer 0052

Je te laisse adapter.
__________________
Je ne réponds pas aux questions techniques par MP, le forum est là pour cela.

La crypto c'est comme les flambys, une fois que tu as trouvé la languette tu as juste à tirer pour tout faire tomber.

(\ _ /)
(='.'=)
Voici Lapinou. Aidez le à conquérir le monde
(")-(") en le reproduisant
Drizzt [Drone38] est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/03/2008, 15h57   #4
Rédacteur/Modérateur
 
Avatar de orafrance
 
Inscription : janvier 2004
Messages : 15 861
Détails du profil
Informations personnelles :
Âge : 35

Informations forums :
Inscription : janvier 2004
Messages : 15 861
Points : 16 212
Points : 16 212
par exemple :
Code :
1
2
	TABLE_V.E|| _ ||
trim(to_char(to_number(translate(lower(TABLE_V.F),'abcdefjhijklmnopqrstuvwxyz',' ')),'0000'))
je remplace les lettres par un espace, j'ajoute les 0 avec le TO_CHAR(col, '0000') et je supprime les espaces

LPAD c'est mien idiot

Code :
trim(lpad(to_number(translate(lower(TABLE_V.F),'abcdefjhijklmnopqrstuvwxyz',' ')),4,'0'))
orafrance est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/03/2008, 16h01   #5
McM
Expert Confirmé Sénior
 
Inscription : juillet 2003
Messages : 3 459
Détails du profil
Informations forums :
Inscription : juillet 2003
Messages : 3 459
Points : 4 226
Points : 4 226
C'est plus simple avec ltrim

Code :
1
2
3
4
5
6
7
8
WITH t AS (SELECT '10' v FROM dual UNION SELECT '20a' FROM dual UNION SELECT 'b' FROM dual)
SELECT v,SUBSTR(v, 0, NVL(LENGTH(v) - LENGTH(LTRIM(v, '0123456789')), LENGTH(v))) AS valeur
FROM t
 
V	VALEUR
10	10
20a	20
b
__________________
More Code : More Bugs. Less Code : Less Bugs
McM est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/03/2008, 16h26   #6
Invité de passage
 
Inscription : février 2008
Messages : 3
Détails du profil
Informations forums :
Inscription : février 2008
Messages : 3
Points : 1
Points : 1
Par défaut PL/SQL

Merci pour vos réponses, je vais tester vos solutions, merci encore.
kantor est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/03/2008, 11h15   #7
Invité de passage
 
Inscription : février 2008
Messages : 3
Détails du profil
Informations forums :
Inscription : février 2008
Messages : 3
Points : 1
Points : 1
Par défaut PL/SQL requete

Merci pour votre aide à tous et en particulier à orafrance car j'ai utilisé ta sol ca marche nickel
kantor 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 08h17.


 
 
 
 
Partenaires

Hébergement Web