Précédent   Forum du club des développeurs et IT Pro > 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
 
Outils de la discussion
Publicité
'
Vieux 27/11/2012, 11h11   #1
Frigok
Invité de passage
 
Inscription : mars 2009
Messages : 9
Détails du profil
Informations forums :
Inscription : mars 2009
Messages : 9
Points : 3
Points : 3
Par défaut Majuscule au premier mot de chaque phrase

Bonjour,

Je rencontre un problème avec Oracle.
Quand j'enregistre une chaine via mon appli, celle-ci passe automatiquement en majuscule dans ma BDD.

Du coup, je cherche à faire une méthode qui me permette de mettre le texte en minuscule sauf pour le premier mot de chaque phrase sur un select.

Est-ce possible? Je ne trouve rien sur le net.

Merci d'avance.
Frigok est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/11/2012, 11h31   #2
Bibeleuh
Membre éclairé
 
Avatar de Bibeleuh
 
Homme Richard
Développeur PL/SQL
Inscription : septembre 2010
Messages : 132
Détails du profil
Informations personnelles :
Nom : Homme Richard
Localisation : France

Informations professionnelles :
Activité : Développeur PL/SQL
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : septembre 2010
Messages : 132
Points : 348
Points : 348
Salut,

La fonction INITCAP permets de mettre la première lettre d'un mot en majuscule mais pas d'une phrase : si t'as plusieurs mots dans ton VARCHAR ils auront tous la premère lettre en majuscule et c'est pas top ...

Pour la phrase il faut donc faire une petite gymnastique comme montré dans le code ci-dessous :

Code :
1
2
3
4
5
6
7
8
9
10
 
WITH test AS (SELECT 'je suis un test' phrase FROM DUAL
                UNION ALL
              SELECT 'deuxième test' FROM DUAL
             )
SELECT LPAD (SUBSTR (phrase, 2, LENGTH (phrase) - 1),
             LENGTH (phrase),
             UPPER (SUBSTR (phrase, 1, 1)))
          ma_phrase
  FROM test;
Résultat :
Citation:
MA_PHRASE
Je suis un test
Deuxième test
Bibeleuh est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 27/11/2012, 11h57   #3
Frigok
Invité de passage
 
Inscription : mars 2009
Messages : 9
Détails du profil
Informations forums :
Inscription : mars 2009
Messages : 9
Points : 3
Points : 3
Bonjour,

Merci pour cette réponse rapide mais en fait je me suis mal exprimé.

J'enregistre dans ma BDD des phrases. Du coup, je cherche une méthode pour mettre chaque première lettre de chaque premier de mes phrases de mon champ en majuscules.
Pour obtenir ce champ, pas d'union : select corps_email from email.

Ex : "BONJOUR. JE M'APPELLE FRIGOK. JE SUIS NUL EN PL/SQL.

deviendrait : "Bonjour. Je m'appelle frigok. Je suis nul en pl/sql."

Le top du top serait de pouvoir définir des conditions en fonctions des fins de phrases. Par exemple, si je rencontre un "." ou un "!" ou encore un "?", je passe la première lettre suivante en majuscule.
Frigok est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/11/2012, 12h49   #4
islamov2000
Membre chevronné
 
Avatar de islamov2000
 
Homme islamov islamov
Ingénieur d'études & developpement en informatique
Inscription : septembre 2007
Messages : 465
Détails du profil
Informations personnelles :
Nom : Homme islamov islamov
Localisation : Algérie

Informations professionnelles :
Activité : Ingénieur d'études & developpement en informatique
Secteur : Industrie

Informations forums :
Inscription : septembre 2007
Messages : 465
Points : 642
Points : 642
Envoyer un message via Yahoo à islamov2000 Envoyer un message via Skype™ à islamov2000
essaie ça

Code :
1
2
3
4
5
6
7
8
  WITH test 
AS
  (
   SELECT  ' BONJOUR. JE M''APPELLE FRIGOK. JE SUIS NUL EN PL/SQL.'   str FROM dual  
   )
SELECT ROWNUM,upper(substr(trim(regexp_substr (str, '[^.]+', 1, rownum)),1,1))||lower(substr(trim(regexp_substr (str, '[^.]+', 1, rownum)),2)) split 
  FROM test 
connect BY level <= length (regexp_replace (str, '[^.]+'))  + 1

Code :
1
2
3
4
	1	Bonjour
	2	Je m'appelle frigok
	3	Je suis nul en pl/sql
	4
__________________
d'avoir Pensé à voter positivement pour ceux qui vous ont aidés.
islamov2000 est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 27/11/2012, 14h09   #5
Bibeleuh
Membre éclairé
 
Avatar de Bibeleuh
 
Homme Richard
Développeur PL/SQL
Inscription : septembre 2010
Messages : 132
Détails du profil
Informations personnelles :
Nom : Homme Richard
Localisation : France

Informations professionnelles :
Activité : Développeur PL/SQL
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : septembre 2010
Messages : 132
Points : 348
Points : 348
islamov2000 -> ça te retourne une ligne par phrase ton script je sais pas si tel était le besoin initial

Moi je pense qu'il faudrait implémenter ta propre fonction déjà pour rendre le code SQL plus propre .

Il y a un forum où un participant a codé une telle fonction et j'ai l'impression qu'elle fonctionne plutôt bien:


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
26
27
 
WITH t AS
     (SELECT 'this is a sentence. make it initcap' str FROM dual union ALL
      SELECT 'here is a another sentence.no space left here' str FROM dual)
---
---      
SELECT DISTINCT str, upper (substr (str_new, 1, 1)) || substr (str_new, 2) str_new
  FROM (SELECT str str,
               case
                  when length (REPLACE (str, '. ')) != length (str)
                     then REPLACE (str,
                                   '. ' || chr (l + 32),
                                   '. ' || chr (l)
                                  )
                  when length (REPLACE (str, '.')) != length (str)
                     then REPLACE (str, '.' || chr (l + 32), '.' || chr (l))
               end str_new
          FROM t,
               (SELECT     level + 64 l
                      FROM dual
                connect BY level <= 26))
 WHERE str != str_new
 
STR                                                STR_NEW                                           
-------------------------------------------------- --------------------------------------------------
here IS a another sentence.no space LEFT here      Here IS a another sentence.No space LEFT here     
this IS a sentence. make it initcap                This IS a sentence. Make it initcap
Source : https://forums.oracle.com/forums/thr...hreadID=535287
Bibeleuh est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 27/11/2012, 14h58   #6
Frigok
Invité de passage
 
Inscription : mars 2009
Messages : 9
Détails du profil
Informations forums :
Inscription : mars 2009
Messages : 9
Points : 3
Points : 3
Merci beaucoup, je vais regarder ça de plus près et je reviens vers vous
Frigok est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/11/2012, 15h11   #7
islamov2000
Membre chevronné
 
Avatar de islamov2000
 
Homme islamov islamov
Ingénieur d'études & developpement en informatique
Inscription : septembre 2007
Messages : 465
Détails du profil
Informations personnelles :
Nom : Homme islamov islamov
Localisation : Algérie

Informations professionnelles :
Activité : Ingénieur d'études & developpement en informatique
Secteur : Industrie

Informations forums :
Inscription : septembre 2007
Messages : 465
Points : 642
Points : 642
Envoyer un message via Yahoo à islamov2000 Envoyer un message via Skype™ à islamov2000
complement de réponse un peu compliqué.


Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
 
 
  WITH test 
AS
  (
   SELECT  ' BONJOUR. JE M''APPELLE FRIGOK. JE SUIS NUL EN PL/SQL.'   str FROM dual  
   )
 
 
  SELECT rtrim(REPLACE(REPLACE(REPLACE(XMLAGG(XMLElement("x", etape_1.split) ORDER BY etape_1.split ASC),'<x>', ''),'</x>', '. '),'&'||'apos;',''''),'. ') AS phrase
  FROM  
 
(
SELECT ROWNUM,upper(substr(trim(regexp_substr (str, '[^.]+', 1, rownum)),1,1))||lower(substr(trim(regexp_substr (str, '[^.]+', 1, rownum)),2)) split 
  FROM test 
connect BY level <= length (regexp_replace (str, '[^.]+'))  + 1
 
)etape_1
Code :
1	Bonjour. Je m'appelle frigok. Je suis nul en pl/sql
__________________
d'avoir Pensé à voter positivement pour ceux qui vous ont aidés.
islamov2000 est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 27/11/2012, 15h50   #8
skuatamad
Expert Confirmé
 
Inscription : août 2008
Messages : 1 716
Détails du profil
Informations forums :
Inscription : août 2008
Messages : 1 716
Points : 2 853
Points : 2 853
Islamov, il n'est pas possible d'utiliser le trick du CONNECT BY LEVEL sur une table de plus d'une ligne, on ne peut donc s'en servir que sur DUAL.
Ou alors il faut plus blinder :
http://www.developpez.net/forums/d12...l/#post6993310
skuatamad est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/11/2012, 16h32   #9
Frigok
Invité de passage
 
Inscription : mars 2009
Messages : 9
Détails du profil
Informations forums :
Inscription : mars 2009
Messages : 9
Points : 3
Points : 3
Je vous remercie tous, pour l'aide.

Je confirme que la solution d'Islamov ne me retourne pas mon texte tel qu'il devrait être.

J'ai vu avec un collègue et il m'a fait une fonction qui marche bien :

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
26
27
28
29
30
31
32
33
34
35
36
37
 
CREATE OR REPLACE FUNCTION XXXXXXX.f_texte_email (p_corpsemail IN VARCHAR2)
RETURN VARCHAR2
IS
 v_corpsemail VARCHAR2(4000);
 v_longueur NUMBER;
 v_position NUMBER;
 v_majuscule NUMBER;
 v_caractere VARCHAR2(1);
BEGIN
 v_corpsemail := '';
 v_longueur := LENGTH(p_corpsemail);
 v_position := 1;
 v_majuscule := 1;
 
 WHILE (v_position <= v_longueur)
 LOOP
   v_caractere := SUBSTR(p_corpsemail, v_position, 1);
   IF (v_caractere = '.' OR v_caractere = CHR(10))
   THEN
     v_majuscule := 1;
   ELSE
     IF (v_majuscule = 1 AND INSTR('ÉÈÊËÀÂÄÎÏÙÛÜÔÖABCDEFGHIJKLMNOPQRSTUVWXYZ',v_caractere) > 0)
     THEN
       v_majuscule := 0;
  ELSE
    v_caractere := LOWER(v_caractere);
  END IF;
   END IF;  
 
   v_corpsemail := v_corpsemail || v_caractere;
 
   v_position := v_position + 1;
 END LOOP; 
 
 RETURN v_corpsemail;
END;
Et ça marche bien.

Merci encore. Bonne soirée.
Frigok est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/11/2012, 11h38   #10
Waldar
Modérateur
 
Homme Fabien
Ingénieur d'études en décisionnel
Inscription : septembre 2008
Messages : 6 278
Détails du profil
Informations personnelles :
Nom : Homme Fabien
Âge : 35
Localisation : France, Essonne (Île de France)

Informations professionnelles :
Activité : Ingénieur d'études en décisionnel
Secteur : High Tech - Multimédia et Internet

Informations forums :
Inscription : septembre 2008
Messages : 6 278
Points : 13 480
Points : 13 480
Envoyer un message via ICQ à Waldar Envoyer un message via Skype™ à Waldar
Citation:
Envoyé par skuatamad Voir le message
Islamov, il n'est pas possible d'utiliser le trick du CONNECT BY LEVEL sur une table de plus d'une ligne, on ne peut donc s'en servir que sur DUAL.
C'est possible, j'en ai montré un exemple récemment ici :
http://www.developpez.net/forums/d12...l/#post6993310

Évidemment on détourne encore un peu une commande déjà détournée.
__________________
Email : http://scr.im/waldar
Waldar est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/11/2012, 11h54   #11
skuatamad
Expert Confirmé
 
Inscription : août 2008
Messages : 1 716
Détails du profil
Informations forums :
Inscription : août 2008
Messages : 1 716
Points : 2 853
Points : 2 853
Citation:
Envoyé par Waldar Voir le message
C'est possible, j'en ai montré un exemple récemment ici :
C'est ce qu'il y avait derrière :
Citation:
Envoyé par skuatamad Voir le message
skuatamad est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 29/11/2012, 15h24   #12
Waldar
Modérateur
 
Homme Fabien
Ingénieur d'études en décisionnel
Inscription : septembre 2008
Messages : 6 278
Détails du profil
Informations personnelles :
Nom : Homme Fabien
Âge : 35
Localisation : France, Essonne (Île de France)

Informations professionnelles :
Activité : Ingénieur d'études en décisionnel
Secteur : High Tech - Multimédia et Internet

Informations forums :
Inscription : septembre 2008
Messages : 6 278
Points : 13 480
Points : 13 480
Envoyer un message via ICQ à Waldar Envoyer un message via Skype™ à Waldar
__________________
Email : http://scr.im/waldar
Waldar est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Cette discussion est résolue.
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 00h19.


 
 
 
 
Partenaires

Hébergement Web