Précédent   Forum des professionnels en informatique > Bases de données > Oracle > SQL
SQL Forum d'entraide sur le SQL pour 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 17/05/2011, 15h28   #1
Membre Expert
 
Avatar de zoom61
 
Homme Vincent ...
Passionné d'informatique
Inscription : janvier 2005
Messages : 1 217
Détails du profil
Informations personnelles :
Nom : Homme Vincent ...
Âge : 39
Localisation : France, Haute Vienne (Limousin)

Informations professionnelles :
Activité : Passionné d'informatique
Secteur : Industrie

Informations forums :
Inscription : janvier 2005
Messages : 1 217
Points : 1 506
Points : 1 506
Envoyer un message via Yahoo à zoom61 Envoyer un message via Skype™ à zoom61
Par défaut Problème avec dbms_random.value

Voici en gros mon code :
Code :
1
2
3
WITH lst AS (SELECT ... FROM ...),
  val AS (SELECT trunc(dbms_random.value*5) nb FROM dual WHERE rownum = 1)
SELECT lst.*, val.* FROM lst, val
Dans ce cas la valeur val.nb est fixe.

Mais si je mets un filtre sur cette valeur val.nb varie :
Code :
1
2
3
WITH lst AS (SELECT ... FROM ...),
  val AS (SELECT trunc(dbms_random.value*5) nb FROM dual WHERE rownum = 1)
SELECT lst.*, val.* FROM lst, val WHERE lst.rdm < val.nb
Avez-vous une idée ?
__________________
N'oubliez pas le Tag :

C'est en parvenant à nos fins par l'effort, en étant prêt à faire le sacrifice de profits immédiats en faveur du bien-être d'autrui à long terme, que nous parviendrons au bonheur caractérisé par la paix et le contentement authentique. [Dalaï Lama]
Je ne réponds pas aux messages privés s'ils sont liés à une question du forum

Mon site sur Developpez.com
zoom61 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/05/2011, 16h25   #2
Modérateur
 
Homme Fabien
Ingénieur d'études en décisionnel
Inscription : septembre 2008
Messages : 5 684
Détails du profil
Informations personnelles :
Nom : Homme Fabien
Âge : 34
Localisation : France, Yvelines (Île de France)

Informations professionnelles :
Activité : Ingénieur d'études en décisionnel
Secteur : Arts - Culture

Informations forums :
Inscription : septembre 2008
Messages : 5 684
Points : 10 438
Points : 10 438
Envoyer un message via ICQ à Waldar Envoyer un message via Skype™ à Waldar
Tient oui c'est étrange, sur une 11.1.0.7.0 :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
WITH SR AS
(
SELECT trunc(dbms_random.value * 10) nb
  FROM dual
 WHERE rownum = 1
)
SELECT sr.nb, ao.object_id
  FROM sr, all_objects ao
 WHERE ao.object_id < sr.nb;
 
        NB  OBJECT_ID
---------- ----------
         9          2
         1          3
         1          4
         1          5
         1          6
         1          7
         1          8
Le NB varie mais que sur la première ligne.
Je constate le même comportement sans le rownum = 1.

Par contre si on écrit explicitement le cross join, ça a l'air fixe :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
WITH SR AS
(
SELECT trunc(dbms_random.value * 20) nb
  FROM dual
 WHERE rownum = 1
)
SELECT sr.nb, ao.object_id
  FROM sr CROSS JOIN all_objects ao
 WHERE ao.object_id < sr.nb;
 
        NB  OBJECT_ID
---------- ----------
        11          3
        11          9
        11          7
        11          6
        11          5
        11          8
        11         10
        11          2
        11          4
Il faut par contre garder aussi le rownum = 1, si je le supprime le NB est ré-évalué à chaque ligne.
__________________
Email : http://scr.im/waldar
Waldar est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/05/2011, 16h51   #3
Membre Expert
 
Inscription : août 2008
Messages : 1 271
Détails du profil
Informations forums :
Inscription : août 2008
Messages : 1 271
Points : 1 929
Points : 1 929
Il faut regarder le plan voir si Oracle materialise bien le WITH.
Normalement le côté spécial de rownum fait que le WITH est matérialisé, mais est ce du 100% ? je ne sais pas.
Qu'est ce que ça donne avec le hint materialize ?

Sinon voir cette discussion très intéressante sur asktom concernant dbms_random.value
skuatamad est déconnecté   Envoyer un message privé Réponse avec citation 20
Vieux 17/05/2011, 17h14   #4
Modérateur
 
Homme Fabien
Ingénieur d'études en décisionnel
Inscription : septembre 2008
Messages : 5 684
Détails du profil
Informations personnelles :
Nom : Homme Fabien
Âge : 34
Localisation : France, Yvelines (Île de France)

Informations professionnelles :
Activité : Ingénieur d'études en décisionnel
Secteur : Arts - Culture

Informations forums :
Inscription : septembre 2008
Messages : 5 684
Points : 10 438
Points : 10 438
Envoyer un message via ICQ à Waldar Envoyer un message via Skype™ à Waldar
Bien vu, avec le hint le random n'est bien calculé qu'une seule fois.
__________________
Email : http://scr.im/waldar
Waldar est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/05/2011, 07h36   #5
Membre Expert
 
Avatar de zoom61
 
Homme Vincent ...
Passionné d'informatique
Inscription : janvier 2005
Messages : 1 217
Détails du profil
Informations personnelles :
Nom : Homme Vincent ...
Âge : 39
Localisation : France, Haute Vienne (Limousin)

Informations professionnelles :
Activité : Passionné d'informatique
Secteur : Industrie

Informations forums :
Inscription : janvier 2005
Messages : 1 217
Points : 1 506
Points : 1 506
Envoyer un message via Yahoo à zoom61 Envoyer un message via Skype™ à zoom61
Cela ne fonctionne pas...

Par contre cela fonctionne correctement :
Code :
1
2
3
4
SELECT ... 
FROM ...
WHERE ...
  AND rownum BETWEEN to_number(floor(dbms_random.Value(1,1000))) AND 10
__________________
N'oubliez pas le Tag :

C'est en parvenant à nos fins par l'effort, en étant prêt à faire le sacrifice de profits immédiats en faveur du bien-être d'autrui à long terme, que nous parviendrons au bonheur caractérisé par la paix et le contentement authentique. [Dalaï Lama]
Je ne réponds pas aux messages privés s'ils sont liés à une question du forum

Mon site sur Developpez.com
zoom61 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 13h47.


 
 
 
 
Partenaires

Hébergement Web