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

Oracle Discussion :

Générer un compteur


Sujet :

Oracle

  1. #1
    LEK
    LEK est déconnecté
    Membre éclairé
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    715
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 715
    Par défaut Générer un compteur
    Bonjour, je me pose la question suivante j'aimerais pouvoir effectuer une centaine d'insertion de données. L'ensemble de mes insert porte sur une même table et seulement différencier par l'identifiant de la ligne. Je peux effectuer mes insertions en utilisant des boucles PL, mais quelqu'un connaitrait-il un moyen de générer un compteur (?) me ramenant un nombre n de ligne pour que je puisse écrire une insertion du type :

    insert into ma_table (id,label)
    select cpteur , 'toto from
    compteur ...

  2. #2
    Rédacteur

    Homme Profil pro
    Développeur et DBA Oracle
    Inscrit en
    Octobre 2006
    Messages
    878
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur et DBA Oracle

    Informations forums :
    Inscription : Octobre 2006
    Messages : 878
    Par défaut
    salut ,

    Tu peux faire une boucle et la dans tu mets

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    declare 
    i number ;
    begin 
    for i  in  1..100 
    loop
     execute immediate ' insert into t values('||i||',''toto'')';
    end loop;
    end ;

  3. #3
    LEK
    LEK est déconnecté
    Membre éclairé
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    715
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 715
    Par défaut
    Effectivement il est possible faire une boucle PL mais ma question est tout autre : est il possible de générer n ligne en sortie d'une requête pour avoir un compteur (Je veux bien sûr considérer une solution propre et non pas récupérer le rownum d'une table quelconque...)

  4. #4
    Expert confirmé
    Homme Profil pro
    Big Data / Freelance EURL
    Inscrit en
    Mars 2003
    Messages
    2 124
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Big Data / Freelance EURL

    Informations forums :
    Inscription : Mars 2003
    Messages : 2 124
    Par défaut
    et ça ?

    SQL: [Oracle 10g] renumérotez les records d'une table

    sans la multiplication x 10.

    (réponse d'origine donnée par sqlpro)

    edit: sinon il faut utiliser une séquence.

  5. #5
    LEK
    LEK est déconnecté
    Membre éclairé
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    715
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 715
    Par défaut
    Je n'ai pas oracle sous la main, je ferais un test demain. Mais a priori ce type de requete peux me permettre de simuler un rownum à partir d'une table lambda... Cela ne répond pas vraiment à ma question : je pourrais plus simplement me servir du rownum et effectuer une requete que je sais volumineuse en générant un ou deux produits cartésien suivant le nombre n de lignes désiré :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    select rownum from 
      table_a, table_a,table_a
    where rownum< n
    Mais même si je doute qu'elle n'existe surement pas je me suis demandé si il était possible d'écrire une requete qui génère les n lignes demandées en se servant seulement des fonctions oracle et eventuellement de la table dual, pour effectuer un compteur universel qui ne repose pas sur le contenu de telle ou telle lambda...

  6. #6
    Rédacteur

    Homme Profil pro
    Développeur et DBA Oracle
    Inscrit en
    Octobre 2006
    Messages
    878
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur et DBA Oracle

    Informations forums :
    Inscription : Octobre 2006
    Messages : 878
    Par défaut
    Salut,

    Désolé pour ma première réponse, mais maintenant j'ai bien compris ton problème.

    Essaie ce code, ca marche trés bien a partir de la version 9i

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    insert into ma_table (id,label)  
    SELECT 
      compteur.cpt ,
      'toto '
    FROM 
      (select  rownum cpt   
       from  ( select 1 
                 from dual   
                 group by cube(1,1,1,1,1,1,1))
       WHERE  rownum<=100)compteur
    La sous-requette ci-dessous te génere les nombres de 1 a 100
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    (select  rownum cpt   
       from  ( select 1 
                 from dual   
                 group by cube(1,1,1,1,1,1,1))
       WHERE   rownum<=100)

  7. #7
    LEK
    LEK est déconnecté
    Membre éclairé
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    715
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 715
    Par défaut
    wow! parfait je ne pensais pas que c'était réalisable mais effectivement cela répond à mon besoin.
    Merci encore

  8. #8
    Membre Expert

    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Janvier 2004
    Messages
    2 862
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 862
    Par défaut
    Je croyais que tu voulais une solution sans rownum

    Une autre solution sans rownum :
    http://www.developpez.net/forums/sho...23&postcount=8

  9. #9
    LEK
    LEK est déconnecté
    Membre éclairé
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    715
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 715
    Par défaut
    Non ce que je précisais, c'était que je ne voulais pas générer un compteur basé sur un select sur une table lambda dont je ne sais pas à priori combien de ligne elle possède et en jouant ensuite avec le rownum...

    Par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    select rownum from lambda where rownum < 10

  10. #10
    Nouveau candidat au Club
    Profil pro
    chef de projet
    Inscrit en
    Avril 2007
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : Tunisie

    Informations professionnelles :
    Activité : chef de projet

    Informations forums :
    Inscription : Avril 2007
    Messages : 2
    Par défaut
    une solution plus simple sans passer par les tables sans passer par rownum :


    select level from (select 1 from dual) connect by level<=:n

  11. #11
    Membre émérite Avatar de Yorglaa
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    845
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : Suisse

    Informations forums :
    Inscription : Janvier 2004
    Messages : 845
    Par défaut
    Salut,
    je ne pense pas que se soit exactement la solution recherchée, mais perso j'utilise une petite fonction PL/SQL qui me ramène un tableau de nombre que je peux référencer en tant que table...
    l'avantage est que je donne 2 paramètres à ma fonction, de manière à ne pas forcément avoir un tableau de 1 à n mais de x à y, sans forcément débuter à 1

    le type de tableau
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Create or replace Type nTabType is Table of Number ;
    la fonction :
    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
    CREATE OR REPLACE function compteur ( 
                                            nStart  in  number     ,
                                            nStop   in  number     
                                        )  
    Return nTabType
    Is
     
        returnTab               nTabType := nTabType() ;
        idx                     number := 0 ;
     
    Begin
     
        for i in nStart .. nStop
        Loop    
            returnTab.extend ;
            idx := idx + 1 ;
            returnTab(idx) := i  ;
        End Loop ;
     
     
        return returnTab ;
     
    End ;
    /
    et l'utilisation
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    INFOCENTRE@rasp> SELECT * FROM TABLE(compteur(1,4)) ;
     
    COLUMN_VALUE
    ------------
               1
               2
               3
               4
    et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    INFOCENTRE@rasp> SELECT * FROM TABLE(compteur(11,16)) ;
     
    COLUMN_VALUE
    ------------
              11
              12
              13
              14
              15
              16

  12. #12
    Nouveau candidat au Club
    Profil pro
    chef de projet
    Inscrit en
    Avril 2007
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : Tunisie

    Informations professionnelles :
    Activité : chef de projet

    Informations forums :
    Inscription : Avril 2007
    Messages : 2
    Par défaut
    select * from (
    select level+: x-1 num from (select 1 from dual) connect by level<=:y-: x+1 )


    pour : x=11 et y =16

    Num
    ----
    11
    12
    13
    14
    15
    16

  13. #13
    Membre Expert

    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Janvier 2004
    Messages
    2 862
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 862
    Par défaut
    Citation Envoyé par fidodido
    une solution plus simple sans passer par les tables sans passer par rownum :


    select level from (select 1 from dual) connect by level<=:n
    Attention cette solution fonctionne plus ou moins bien selon les versions :
    http://www.developpez.net/forums/sho...5&postcount=16

  14. #14
    Membre émérite Avatar de Yorglaa
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    845
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : Suisse

    Informations forums :
    Inscription : Janvier 2004
    Messages : 845
    Par défaut
    Citation Envoyé par fidodido
    select * from (
    select level+: x-1 num from (select 1 from dual) connect by level<=:y-: x+1 )


    pour : x=11 et y =16

    Num
    ----
    11
    12
    13
    14
    15
    16
    bah... il y a évidemment plusieurs solution, et je ne prétends pas qu'une soit meilleure que l'autre...

    toutefois ce qui me plait dans ma solution c'est qu'il s'agit d'un objet compilé, donc réutilisable dans plein de contextes sans avoir ajouter des sous select à toutes les sauces...

    de plus, pour les version inférieures à 10g, l'utilisation intensive de la table dual se traduit tout de même par des IO supplémentaire puisqu'il s'agit (encore) d'une table physique.

  15. #15
    LEK
    LEK est déconnecté
    Membre éclairé
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    715
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 715
    Par défaut
    Merci fidodido, la solution que tu proposes est vraiment intéressante et semble nettement plus performante que l'utilisation du regroupement par cube() qui suivant le niveau de récursion devient rapidement non performant. Effectivement la syntaxe ne s'applique pas à toutes les versions d'Oracle (pas de prob. pour moi je suis en 10g), mais cette requête reste vraiment séduisante.
    Merci Yorglaa ta solution a au moins le mérite de montrer comment renvoyer le contenu de tableau comme étant un résultat de table.

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

Discussions similaires

  1. [ Struts ] générer un compteur journalier
    Par jakouz dans le forum Struts 1
    Réponses: 3
    Dernier message: 19/04/2006, 09h29
  2. Réponses: 2
    Dernier message: 31/08/2002, 14h00
  3. Générer un nombre aléatoire entre 0 et 1 (INCLUS !!!)
    Par haypo dans le forum Algorithmes et structures de données
    Réponses: 3
    Dernier message: 22/08/2002, 16h30
  4. [CR][VB] comment générer un état ?
    Par ndi dans le forum SDK
    Réponses: 3
    Dernier message: 22/08/2002, 13h13
  5. Réponses: 5
    Dernier message: 08/07/2002, 16h22

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