Précédent   Forum des professionnels en informatique > Bases de données > Oracle
Oracle Forum Oracle : le serveur, les outils, ... Voir F.A.Q Oracle Tutoriels Oracle
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 04/04/2007, 21h36   #1
LEK
Membre éclairé
 
Inscription : mai 2005
Messages : 596
Détails du profil
Informations forums :
Inscription : mai 2005
Messages : 596
Points : 363
Points : 363
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 ...
LEK est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/04/2007, 21h42   #2
Rédacteur
 
Homme Salim
Développeur et DBA Oracle
Inscription : octobre 2006
Messages : 872
Détails du profil
Informations personnelles :
Nom : Homme Salim
Localisation : Canada

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

Informations forums :
Inscription : octobre 2006
Messages : 872
Points : 1 100
Points : 1 100
salut ,

Tu peux faire une boucle et la dans tu mets

Code :
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 ;
salim11 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/04/2007, 22h10   #3
LEK
Membre éclairé
 
Inscription : mai 2005
Messages : 596
Détails du profil
Informations forums :
Inscription : mai 2005
Messages : 596
Points : 363
Points : 363
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...)
LEK est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/04/2007, 22h13   #4
Membre Expert
 
Homme
Expert Datawarehouses + BO (sur BDD Oracle et SQL Server)
Inscription : mars 2003
Messages : 645
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 41
Localisation : France, Rhône (Rhône Alpes)

Informations professionnelles :
Activité : Expert Datawarehouses + BO (sur BDD Oracle et SQL Server)

Informations forums :
Inscription : mars 2003
Messages : 645
Points : 1 165
Points : 1 165
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.
phili_b est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/04/2007, 22h28   #5
LEK
Membre éclairé
 
Inscription : mai 2005
Messages : 596
Détails du profil
Informations forums :
Inscription : mai 2005
Messages : 596
Points : 363
Points : 363
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 :
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...
LEK est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/04/2007, 00h07   #6
Rédacteur
 
Homme Salim
Développeur et DBA Oracle
Inscription : octobre 2006
Messages : 872
Détails du profil
Informations personnelles :
Nom : Homme Salim
Localisation : Canada

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

Informations forums :
Inscription : octobre 2006
Messages : 872
Points : 1 100
Points : 1 100
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 :
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 :
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)
salim11 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/04/2007, 19h20   #7
LEK
Membre éclairé
 
Inscription : mai 2005
Messages : 596
Détails du profil
Informations forums :
Inscription : mai 2005
Messages : 596
Points : 363
Points : 363
wow! parfait je ne pensais pas que c'était réalisable mais effectivement cela répond à mon besoin.
Merci encore
LEK est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/04/2007, 09h46   #8
Expert Confirmé
 
Homme
Chef de projet en SSII
Inscription : janvier 2004
Messages : 2 866
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 866
Points : 3 448
Points : 3 448
Je croyais que tu voulais une solution sans rownum

Une autre solution sans rownum :
http://www.developpez.net/forums/sho...23&postcount=8
__________________
Un problème sans solution est un problème mal posé

Merci de poser vos questions sur le forum, je ne réponds pas aux questions posées par MP.
plaineR est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/04/2007, 19h03   #9
LEK
Membre éclairé
 
Inscription : mai 2005
Messages : 596
Détails du profil
Informations forums :
Inscription : mai 2005
Messages : 596
Points : 363
Points : 363
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 :
1
2
 
SELECT rownum FROM lambda WHERE rownum < 10
LEK est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/04/2007, 10h46   #10
Invité de passage
 
Inscription : avril 2007
Messages : 2
Détails du profil
Informations forums :
Inscription : avril 2007
Messages : 2
Points : 2
Points : 2
une solution plus simple sans passer par les tables sans passer par rownum :


select level from (select 1 from dual) connect by level<=:n
fidodido est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/04/2007, 11h17   #11
Membre émérite
 
Avatar de Yorglaa
 
Inscription : janvier 2004
Messages : 845
Détails du profil
Informations personnelles :
Âge : 41
Localisation : Suisse

Informations forums :
Inscription : janvier 2004
Messages : 845
Points : 939
Points : 939
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 :
CREATE OR REPLACE Type nTabType IS TABLE of Number ;
la fonction :
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
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 :
1
2
3
4
5
6
7
8
INFOCENTRE@rasp> SELECT * FROM TABLE(compteur(1,4)) ;
 
COLUMN_VALUE
------------
           1
           2
           3
           4
et
Code :
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
__________________
Il est plus facile de voir les signes avant-coureurs après coup que l'inverse !

Yorglaa
Yorglaa est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/04/2007, 11h40   #12
Invité de passage
 
Inscription : avril 2007
Messages : 2
Détails du profil
Informations forums :
Inscription : avril 2007
Messages : 2
Points : 2
Points : 2
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
fidodido est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/04/2007, 11h46   #13
Expert Confirmé
 
Homme
Chef de projet en SSII
Inscription : janvier 2004
Messages : 2 866
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 866
Points : 3 448
Points : 3 448
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
__________________
Un problème sans solution est un problème mal posé

Merci de poser vos questions sur le forum, je ne réponds pas aux questions posées par MP.
plaineR est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/04/2007, 13h26   #14
Membre émérite
 
Avatar de Yorglaa
 
Inscription : janvier 2004
Messages : 845
Détails du profil
Informations personnelles :
Âge : 41
Localisation : Suisse

Informations forums :
Inscription : janvier 2004
Messages : 845
Points : 939
Points : 939
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.
__________________
Il est plus facile de voir les signes avant-coureurs après coup que l'inverse !

Yorglaa
Yorglaa est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/04/2007, 13h43   #15
LEK
Membre éclairé
 
Inscription : mai 2005
Messages : 596
Détails du profil
Informations forums :
Inscription : mai 2005
Messages : 596
Points : 363
Points : 363
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.
LEK est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 01h27.


 
 
 
 
Partenaires

Hébergement Web