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 05/01/2012, 17h17   #1
Membre du Club
 
Inscription : février 2005
Messages : 274
Détails du profil
Informations forums :
Inscription : février 2005
Messages : 274
Points : 63
Points : 63
Par défaut Créer une fonction de formatage de chaîne ?

Bonjour,

Comment faire quelques choses comme ceci :

Code :
1
2
3
4
5
CREATE OR REPLACE FUNCTION FORMAT(pChaine VARCHAR2, pTableauChaineDynamique ARRAY OF STRING) RETURN VARCHAR2 IS
BEGIN
  ...
END;
/
Code :
1
2
3
4
5
6
7
8
9
DECLARE
  ChaineRetour VARCHAR2(50);
BEGIN
  --ChaineRetour = 'Créé à 15h14 par toto le 01/01/2012'
  ChaineRetour:= Format('Créé à %s par %s le %s', ['15h14', 'toto', '01/01/2012']);

  --ChaineRetour= Le produit est de couleur rouge
  ChaineRetour:= Format('Le %s est de couleur %s', ['produit', 'rouge']);
END;
Merci
pepito62 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/01/2012, 08h58   #2
Expert Confirmé Sénior
 
Avatar de mnitu
 
Homme Marius Nitu
Ingénieur développement logiciels
Inscription : octobre 2007
Messages : 3 313
Détails du profil
Informations personnelles :
Nom : Homme Marius Nitu
Localisation : France, Marne (Champagne Ardenne)

Informations professionnelles :
Activité : Ingénieur développement logiciels
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : octobre 2007
Messages : 3 313
Points : 5 817
Points : 5 817
1) Utilisez une collection
2) Dans une fonction Format ayant disons 11 paramètres parmi lesquels 10 sont optionnels avec valeur par défaut Null, détectez via la fonction instr la position du caractère %s dans la chaîne des caractères à traiter et avec l’aides des fonctions instr et substr faite le remplacement du %s avec les valeurs souhaitées.
mnitu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/01/2012, 09h55   #3
Membre Expert
 
Avatar de Garuda
 
Homme Philippe CHIRCOP
Chef de projet
Inscription : juin 2007
Messages : 1 109
Détails du profil
Informations personnelles :
Nom : Homme Philippe CHIRCOP
Localisation : France

Informations professionnelles :
Activité : Chef de projet
Secteur : Bâtiment

Informations forums :
Inscription : juin 2007
Messages : 1 109
Points : 1 559
Points : 1 559
Voila une fonction que j'utilise
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
38
39
40
41
42
43
44
45
 
FUNCTION msg(chaine IN varchar2,param IN varchar2) RETURN varchar2 IS
 i integer;
 
 c t_msg_str;
 
 msg t_msg_str;
 
 val t_msg_str;
 
 par integer;
BEGIN
  msg:=NULL;
 
  val:=chaine;
 
  par:=0;
  i:=instr(val,C_SEP_STR); 
 
  while i>0 loop
      c:=substr(val,i+1,1);
     IF c BETWEEN '1' AND '9' OR c IN ('s','t','n') then
      msg:=msg || substr(val,0,i-1);
      val:=substr(val,i+2,length(val)-i-1);
      IF c BETWEEN '1' AND '9' then
       msg:=msg|| Get_param(param,to_number(c)); 
      elsif c = 's' then
       par:=par+1;
       msg:=msg || Get_param(param,par); 
      elsif c = 't' then
       msg:=msg || chr(9);
      elsif c = 'n' then
       msg:=msg || chr(10);
      end IF; 
     else
       msg:=msg || substr(val,0,i);
       val:=substr(val,i+1);
     end IF;
     i:=instr(val,C_SEP_STR); 
    end loop;
    IF msg IS NULL then
     RETURN val;  
    end IF;
   RETURN msg||val;  
END;
NB : Cette fonction est issu d'un package et utilise les constantes et variables et type suivants
Code :
1
2
3
4
 
CONSTANT C_SEP_STR VARCHAR2(1):='/';
CONSTANT C_SEP_PAR VARCHAR2(1):=';';
SUBTYPE t_msg_str IS VARCHAR2(256);
Elle utilise également
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
 
FUNCTION get_param(param IN varchar2,indice IN number) RETURN varchar2 IS
 d integer;
 f integer;
 k integer;
 j integer;
 temp t_msg_str;
 par t_msg_str;
BEGIN
 temp:=param;
 IF substr(temp,length(temp))!= C_SEP_PAR THEN
  temp:=temp||C_SEP_PAR;
 end IF;
 j:=0;
 while instr(temp,C_SEP_PAR)!=0 AND par IS NULL loop
  j:=j+1;
  IF j=indice THEN
   par:=substr(temp,1,instr(temp,C_SEP_PAR)-1);
  else
   temp:=substr(temp,instr(temp,C_SEP_PAR)+1);
  end IF;
 end loop;
 RETURN par;
END;
Chaine : modéle
ex : 'Bonjour, monsieur /1 /2./n Comment allez-vous aujourd'hui /3 ?'
Param : chaine de variable séparée par un séparateur C_SEP_PAR en constante
Ex 'Duchmol;Alain;05/01/2012'







Les formats sont paramètrés ainsi
  • /1,/2,/3,.../x : paramètre 1, paramètre 2, paramètre 3...paramètre x (jusqu'à 9)
  • /s paramétre suivant (dans l'ordre de lecture)
  • /n retour chariot (CHR(10))
  • /t tabulation
Tu dois pouvoir facilement modifier cette fonction pour remplacer 'param' par une collection
__________________
Garuda गरूड
Brahmâ la Guerre et Vishnu la Paix

Oracle 10.2.0.4 - Forms6i patch 17 - Toad 11.1 - sharePoint 2010
Garuda est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/01/2012, 11h05   #4
Membre du Club
 
Inscription : février 2005
Messages : 274
Détails du profil
Informations forums :
Inscription : février 2005
Messages : 274
Points : 63
Points : 63
Merci pour vos réponses.

Je n'en demandais pas tant (notamment au niveau de l'algo)

A première abord, j'aurais fait comme Garuda, avec 2 chaines de caractères passé en paramètre et un séparateur déclaré en constante.

Mais j'aimerais faire quelques choses de meilleurs dans le sens où je n'ai pas de limite d'utilisation car dans l'exemple de Garuda et dans ce que j'aurais fait :
- Si dans les paramètres, la chaîne contient des séparateurs ça ne fonctionne plus.

Vous parlez de Collection, qu'est-ce qu'une collection ? Pouvez-vous me donner un exemple d'utilisation ?

Merci
pepito62 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/01/2012, 11h12   #5
McM
Expert Confirmé Sénior
 
Inscription : juillet 2003
Messages : 3 440
Détails du profil
Informations forums :
Inscription : juillet 2003
Messages : 3 440
Points : 4 183
Points : 4 183
Pour les collections, c'est dans le tuto
http://sheikyerbouti.developpez.com/...?page=Chap5#L5
__________________
More Code : More Bugs. Less Code : Less Bugs
McM est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/01/2012, 11h24   #6
Membre expérimenté
 
François
Inscription : février 2010
Messages : 306
Détails du profil
Informations personnelles :
Nom : François

Informations forums :
Inscription : février 2010
Messages : 306
Points : 537
Points : 537
Ou alors, si vous avez APEX d'installe, autant en profiter et utiliser STRING_TO_TAB deux fois avec une boucle imbrique, une fois avec %s comme separateur, et une autre fois avec ':' ou ce que vous voulez.
Rams7s est déconnecté   Envoyer un message privé Réponse avec citation 10
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 21h12.


 
 
 
 
Partenaires

Hébergement Web