IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

PL/SQL Oracle Discussion :

Créer une fonction de formatage de chaîne ?


Sujet :

PL/SQL Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé

    Inscrit en
    Février 2005
    Messages
    356
    Détails du profil
    Informations forums :
    Inscription : Février 2005
    Messages : 356
    Par défaut Créer une fonction de formatage de chaîne ?
    Bonjour,

    Comment faire quelques choses comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    CREATE OR REPLACE FUNCTION FORMAT(pChaine VARCHAR2, pTableauChaineDynamique ARRAY OF STRING) RETURN VARCHAR2 IS
    BEGIN
      ...
    END;
    /
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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

  2. #2
    Expert confirmé Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    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 : 5 611
    Par défaut
    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.

  3. #3
    Membre Expert Avatar de Garuda
    Homme Profil pro
    Chef de projet / Urbaniste SI
    Inscrit en
    Juin 2007
    Messages
    1 285
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

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

    Informations forums :
    Inscription : Juin 2007
    Messages : 1 285
    Par défaut
    Voila une fonction que j'utilise
    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
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : 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
    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

  4. #4
    Membre éclairé

    Inscrit en
    Février 2005
    Messages
    356
    Détails du profil
    Informations forums :
    Inscription : Février 2005
    Messages : 356
    Par défaut
    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

  5. #5
    McM
    McM est déconnecté
    Expert confirmé

    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Juillet 2003
    Messages
    4 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Juillet 2003
    Messages : 4 580
    Billets dans le blog
    4
    Par défaut
    Pour les collections, c'est dans le tuto
    http://sheikyerbouti.developpez.com/...?page=Chap5#L5

  6. #6
    Membre chevronné
    Profil pro
    Inscrit en
    Février 2010
    Messages
    412
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 412
    Par défaut
    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.

Discussions similaires

  1. Créer une fonction
    Par Jeffboj dans le forum Access
    Réponses: 7
    Dernier message: 15/04/2006, 20h49
  2. Créer une Fonction recherche sur Access
    Par remwideco dans le forum Access
    Réponses: 4
    Dernier message: 30/01/2006, 10h36
  3. créer une fonction avec parametre optionnel
    Par maximenet dans le forum Langage
    Réponses: 2
    Dernier message: 29/01/2006, 20h51
  4. Réponses: 6
    Dernier message: 10/08/2005, 11h36
  5. Créer une fonction mathématique pendant l'exécution
    Par zeprogrameur dans le forum Langage
    Réponses: 5
    Dernier message: 09/07/2004, 11h36

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo