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 :

Compteur avec lettre incrementale [11gR2]


Sujet :

PL/SQL Oracle

  1. #1
    Membre du Club
    Inscrit en
    Novembre 2010
    Messages
    73
    Détails du profil
    Informations forums :
    Inscription : Novembre 2010
    Messages : 73
    Points : 61
    Points
    61
    Par défaut Compteur avec lettre incrementale
    Bonsoir,
    Je cherche a mettre en place une variable avec comme valeur 'nomxx' où xx correspond a une lettre que j'incrementerai a chaque iteration.
    En gros, ca donnerait pour 2 iterations : noma, nomb

    Comment puis-je faire ca en sachant aussi que je depasse tres largement les 26 iterations. Donc il faudrait qu'au dela ca donne nomaa, nomab, etc...

    Merci d'avance.

  2. #2
    Membre expérimenté
    Avatar de islamov2000
    Homme Profil pro
    Ingénieur d'études & developpement en informatique
    Inscrit en
    Septembre 2007
    Messages
    814
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

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

    Informations forums :
    Inscription : Septembre 2007
    Messages : 814
    Points : 1 717
    Points
    1 717
    Billets dans le blog
    6
    Par défaut
    Ça ne nécessite pas forcement une procédure PL/SQL. une simple sql répond au besoin.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    select  'nom'||chr(level)
    from    dual
    where  level  between  97 and 122--si minuscule sinon entre 65 et 90
    connect by level  <255;
    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
    NOM||CHR(LEVEL)
     
    noma
    nomb
    nomc
    nomd
    nome
    nomf
    nomg
    nomh
    nomi
    nomj
    nomk
    noml
    nomm
    nomn
    nomo
    nomp
    nomq
    nomr
    noms
    nomt
    nomu
    nomv
    nomw
    nomx
    nomy
    nomz
    d'avoir Pensé à voter positivement pour ceux qui vous ont aidés et surtout à mettre si le cas.
    ça encourage.

  3. #3
    Membre du Club
    Inscrit en
    Novembre 2010
    Messages
    73
    Détails du profil
    Informations forums :
    Inscription : Novembre 2010
    Messages : 73
    Points : 61
    Points
    61
    Par défaut
    Je parle de PL/SQL car en fait je boucle sur chaque nom trouvé en base de données et pour chaque nom je fais plusieurs traitements dont le changement de ce nom en : nomxx.

    Votre requête marche bien pour 26 itérations, mais au delà?

    En tout cas merci. Ca va bien m'aider

  4. #4
    Membre expérimenté
    Avatar de islamov2000
    Homme Profil pro
    Ingénieur d'études & developpement en informatique
    Inscrit en
    Septembre 2007
    Messages
    814
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

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

    Informations forums :
    Inscription : Septembre 2007
    Messages : 814
    Points : 1 717
    Points
    1 717
    Billets dans le blog
    6
    Par défaut
    Si tu postes le code, ça sera bien pour t'aider.
    d'avoir Pensé à voter positivement pour ceux qui vous ont aidés et surtout à mettre si le cas.
    ça encourage.

  5. #5
    Membre du Club
    Inscrit en
    Novembre 2010
    Messages
    73
    Détails du profil
    Informations forums :
    Inscription : Novembre 2010
    Messages : 73
    Points : 61
    Points
    61
    Par défaut
    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
    DECLARE
    CURSOR CURSEUR_PERSONNE IS select ID,NOMMARITAL,NOMPERSONNE,PRENOM from PERSONNE order by ID;
     
    LIGNE_PERSONNE CURSEUR_PERSONNE %ROWTYPE;
    BEGIN  
     
    OPEN CURSEUR_PERSONNE;
     
    LOOP
     
    BEGIN
    FETCH CURSEUR_PERSONNE INTO LIGNE_PERSONNE;
     
    -- Mise a jour des noms dans la table PERSONNE.
    UPDATE personne SET nompersonne = 'NOM_xx' WHERE nompersonne=CURSEUR_PERSONNE.NOMPERSONNE;
     
    EXIT WHEN CURSEUR_PERSONNE %NOTFOUND; --Quitte la boucle quand il n'y a plus de lignes
     
    END;
    END LOOP;
     
    CLOSE CURSEUR_PERSONNE;
     
    END;
     
    /

  6. #6
    Membre expérimenté
    Avatar de islamov2000
    Homme Profil pro
    Ingénieur d'études & developpement en informatique
    Inscrit en
    Septembre 2007
    Messages
    814
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

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

    Informations forums :
    Inscription : Septembre 2007
    Messages : 814
    Points : 1 717
    Points
    1 717
    Billets dans le blog
    6
    Par défaut
    Essaie ça:
    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
    DECLARE
    CURSOR CURSEUR_PERSONNE IS SELECT ID,NOMMARITAL,NOMPERSONNE,PRENOM FROM PERSONNE ORDER BY ID;
     
    LIGNE_PERSONNE CURSEUR_PERSONNE %ROWTYPE;
    i number:=97;--ligne ajoutée
    BEGIN  
     
    OPEN CURSEUR_PERSONNE;
     
    LOOP
     
    BEGIN
    FETCH CURSEUR_PERSONNE INTO LIGNE_PERSONNE;
     
    -- Mise a jour des noms dans la table PERSONNE.
    UPDATE personne SET nompersonne = 'NOM'||chr(i) WHERE nompersonne=CURSEUR_PERSONNE.NOMPERSONNE;--ligne modfiée
    i:=i+1; -- ligne ajoutée 
    EXIT WHEN CURSEUR_PERSONNE %NOTFOUND; --Quitte la boucle quand il n'y a plus de lignes
     
    END;
    END LOOP;
     
    CLOSE CURSEUR_PERSONNE;
     
    END;
     
    /
    d'avoir Pensé à voter positivement pour ceux qui vous ont aidés et surtout à mettre si le cas.
    ça encourage.

  7. #7
    Membre expérimenté
    Avatar de islamov2000
    Homme Profil pro
    Ingénieur d'études & developpement en informatique
    Inscrit en
    Septembre 2007
    Messages
    814
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

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

    Informations forums :
    Inscription : Septembre 2007
    Messages : 814
    Points : 1 717
    Points
    1 717
    Billets dans le blog
    6
    Par défaut Oracle Update avec order by
    Je t'ai préparé une requête SQL qui répond au même besoin.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    UPDATE PERSONNE A
     set A.nompersonne=(select  C.nompersonne_modifié from (SELECT 'nom_'||chr(96+rownum)nompersonne_modifié ,B.ID 
                                                        FROM PERSONNE B
                                                        ORDER BY B.ID ) C
                      where A.ID=C.ID
                     )
    d'avoir Pensé à voter positivement pour ceux qui vous ont aidés et surtout à mettre si le cas.
    ça encourage.

  8. #8
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Customer Success Manager @Vertica
    Inscrit en
    Septembre 2008
    Messages
    8 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Customer Success Manager @Vertica
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 452
    Points : 17 820
    Points
    17 820
    Par défaut
    Un petit peu de math. Vous voulez en réalité convertir un nombre en base 26 en utilisant des lettres de a à z pour représenter ce nombre.
    Votre nombre maximal d’occurrence est de 26² soit 676 nombres.

    Le premier chiffre sera l'arrondi inférieur de la division de ce nombre par 26.
    Le second sera le reste de la division euclidienne.
    Ces deux opérations sont bien implémentées en SQL.

    Et nul besoin de curseur :
    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
    create table PERSONNE
    ( ID            number(3)
    , NOMPERSONNE   varchar2(30)
    , constraint pk_personne
        primary key (ID)
    );
    -- Table created
     
    insert into PERSONNE (id)
        select level
          from dual
    connect by level <= 350;
    --350 row(s) inserted.
     
    commit;
     
     merge into personne tgt
     using (select id
                 , row_number() over(order by id asc) as id_ord
              from personne) src
        on (src.id = tgt.id)
      when matched then update
       set tgt.nompersonne = 'NOM_' || chr(floor((src.id_ord-1)/26)+97) || chr(mod(src.id_ord-1,26)+97);
    -- Statement processed.
     
    select id, NOMPERSONNE
      from personne
     where rownum <= 10;
     
     
    ID NOMPERSONNE
    -- -----------
     1 NOM_aa
     2 NOM_ab
     3 NOM_ac
     4 NOM_ad
     5 NOM_ae
     6 NOM_af
     7 NOM_ag
     8 NOM_ah
     9 NOM_ai
    10 NOM_aj

  9. #9
    Membre du Club
    Inscrit en
    Novembre 2010
    Messages
    73
    Détails du profil
    Informations forums :
    Inscription : Novembre 2010
    Messages : 73
    Points : 61
    Points
    61
    Par défaut
    Merci à vous pour vos idées.
    @Waldar : je vais récupérer votre script car ça marche nikel.

  10. #10
    Membre du Club
    Inscrit en
    Novembre 2010
    Messages
    73
    Détails du profil
    Informations forums :
    Inscription : Novembre 2010
    Messages : 73
    Points : 61
    Points
    61
    Par défaut
    Finalement j'ai utilisé : dbms_random.strings('U',5);

    Ca me génère donc aléatoirement 5 lettres en majuscules.
    Ca fonctionne très bien, ma procédure est en place depuis 4 jours et c'est nikel. Pas besoin de calcul, etc...

    En tout cas merci pour vos réponses.
    Ca m'a bien aiguillé sur le PL/SQL, etc...

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Compteur avec des lettres
    Par dodo91 dans le forum Général JavaScript
    Réponses: 26
    Dernier message: 19/05/2009, 16h56
  2. Textare et compteur de lettres
    Par trihanhcie dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 20/03/2006, 18h00
  3. Réponses: 26
    Dernier message: 25/11/2005, 16h12
  4. HashCode avec lettres accentuées...
    Par Kineas dans le forum C++
    Réponses: 4
    Dernier message: 08/04/2005, 10h54
  5. Compteur avec OpenDialog
    Par bajax dans le forum C++Builder
    Réponses: 3
    Dernier message: 25/08/2004, 13h48

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