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 05/05/2008, 11h04   #1
Membre chevronné
 
Avatar de randriano
 
Homme Rija Randriano
Inscription : janvier 2007
Messages : 984
Détails du profil
Informations personnelles :
Nom : Homme Rija Randriano
Localisation : Madagascar

Informations forums :
Inscription : janvier 2007
Messages : 984
Points : 729
Points : 729
Par défaut Ordre d'affichage du résultat d'une requête SELECT

Bonjour,

Je me demande si lorsqu'on fait un SELECT simple (pas de jointure) sur une table, l'ordre d'affichage des records trouvés ne doit-il pas être toujours le même (table inchangée) ? C'est du moins ma constatation, ça ne change pas (avec SQL plus, avec des outils tiers comme SQL Manager, un programme que j'écris utilisant ADO, etc.). Même avec une table sous SQL Server avec les même données, ça parait être même ordre (mais je dois encore revérifier)

J'ai posé cette question car récemment (aujourd'hui), il m'est arrivé que dans un 2è prog que j'ai écrit (en C++ avec ADO), l'ordre n'est plus le même et ça a causé une exception de ->MoveNext() !!! Est-ce que par hasard quelqu'un d'ici aurait déja rencontré cette situation ?
__________________
randriano.dvp.com
randriano est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/05/2008, 11h35   #2
Rédacteur/Modérateur
 
Avatar de Vincent Rogier
 
vincent rogier
Inscription : juillet 2007
Messages : 2 355
Détails du profil
Informations personnelles :
Nom : vincent rogier
Âge : 34

Informations forums :
Inscription : juillet 2007
Messages : 2 355
Points : 3 108
Points : 3 108
en théorie, un select simple sans jointure et sans clause order by trie le résultat par rowid (donc ordre de création)
__________________
Vincent Rogier.

Rubrique ORACLE : Accueil - Forum - Tutoriels - FAQ - Livres - Blog

Vous voulez contribuer à la rubrique Oracle ? Contactez la rubrique !

OCILIB (C Driver for Oracle)

Librairie C Open Source multi-plateformes pour accéder et manipuler des bases de données Oracle
Vincent Rogier est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/05/2008, 11h53   #3
Membre chevronné
 
Avatar de philcero
 
Inscription : septembre 2007
Messages : 519
Détails du profil
Informations personnelles :
Âge : 40
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations forums :
Inscription : septembre 2007
Messages : 519
Points : 649
Points : 649
Apparemment ADO peut rencontrer des problèmes avec l'ordre de traitement des rowid.
Va voir cet article de chez Microsoft qui donne une méthode : INFO: Oracle OLE DB Provider and ROWID Use
philcero est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/05/2008, 12h15   #4
Membre chevronné
 
Avatar de randriano
 
Homme Rija Randriano
Inscription : janvier 2007
Messages : 984
Détails du profil
Informations personnelles :
Nom : Homme Rija Randriano
Localisation : Madagascar

Informations forums :
Inscription : janvier 2007
Messages : 984
Points : 729
Points : 729
Citation:
Apparemment ADO peut rencontrer des problèmes avec l'ordre de traitement des rowid.
J'ai lu l'article mais moi, j'utilise le provider d'Oracle !!

Si le résultat est trié selon ROWID, l'ordre doit donc toujours être le même même avec une table oracle exportée vers sql server (j'ai vérifié ça affiche même ordre sous ems sql manager)!! Mais dans mon application, c'est en désordre encore; bon, je vais vérifier pourquoi
__________________
randriano.dvp.com
randriano est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/05/2008, 12h52   #5
McM
Expert Confirmé Sénior
 
Inscription : juillet 2003
Messages : 3 459
Détails du profil
Informations forums :
Inscription : juillet 2003
Messages : 3 459
Points : 4 226
Points : 4 226
Ce n'est pas une certitude 100%

Si tu veux que le tri soit toujours pareil, il faut le faire explicitement.
__________________
More Code : More Bugs. Less Code : Less Bugs
McM est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/05/2008, 13h54   #6
Membre chevronné
 
Avatar de randriano
 
Homme Rija Randriano
Inscription : janvier 2007
Messages : 984
Détails du profil
Informations personnelles :
Nom : Homme Rija Randriano
Localisation : Madagascar

Informations forums :
Inscription : janvier 2007
Messages : 984
Points : 729
Points : 729
Il me semble qu'un select simple est toujours dans l'ordre du ROWID (implicitement bien sur) !!
Mon cas est assez délicat car même si j'ajoute "ORDER BY ROWID", l'ordre ne se fait toujours pas !!!!!!!!!!!!! (sous ADO bien sur)


Scénario:
SELECT nom, matricule FROM matable;

Le count (nombre de records) résultant est de 14. En bouclant pour lire un à un les enregistrements, ça crash à la 7è boucle (toujours ordre dans le désordre) avec l'erreur: "BOF ou EOF est égal à True ou l'enregistrement actuel a été supprimé. L'opération demandée nécessite un enregistrement actuel."
__________________
randriano.dvp.com
randriano est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/05/2008, 14h52   #7
Expert Confirmé Sénior


 
Avatar de laurentschneider
 
Homme Laurent Schneider
Administrateur de base de données
Inscription : décembre 2005
Messages : 2 927
Détails du profil
Informations personnelles :
Nom : Homme Laurent Schneider
Localisation : Suisse

Informations professionnelles :
Activité : Administrateur de base de données
Secteur : Finance

Informations forums :
Inscription : décembre 2005
Messages : 2 927
Points : 4 549
Points : 4 549
non, ce n'est pas le cas.

On ne peut pas déterminer l'ordre. On peut dire "c'est souvent le cas", mais impossible de savoir.

Cela dépend par exemple du plan d'execution, qui peut changer en fonction des statistiques. Par exemple si un index est utilisé, ou un accès parallèle aux partitions, ou autre cas, on ne peut pas savoir dans quel ordre les lignes seront retournées.

Il n'y a aucune raison de croire que l'on recevra toujours les lignes dans le même ordre si l'on employe pas order by :!

Quant à MoveNext, aucune idée
__________________
Mon blog : laurentschneider.com
Mon livre : Advanced Oracle SQL Programming
laurentschneider est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/05/2008, 15h28   #8
Membre chevronné
 
Avatar de randriano
 
Homme Rija Randriano
Inscription : janvier 2007
Messages : 984
Détails du profil
Informations personnelles :
Nom : Homme Rija Randriano
Localisation : Madagascar

Informations forums :
Inscription : janvier 2007
Messages : 984
Points : 729
Points : 729
Citation:
On ne peut pas déterminer l'ordre. On peut dire "c'est souvent le cas", mais impossible de savoir.
D'accord laurent ! En effet, ce n'est pas fixe mais l'ordre ne doit pas être si différent que ça si aucune modif n'est faite dans la table.

Mais ce qui m'arrive maintenant c'est que l'ordre obtenu dans mon nouveau programme est si désordonné que le programme crash à la lecture de la 7è parmi 14. Ce 7è est le dernier résultat normalement sur les autres (sql plus, mon ancien prog, etc.). Bon, je vais voir quelle est l'erreur ?
__________________
randriano.dvp.com
randriano est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/05/2008, 15h36   #9
Expert Confirmé Sénior


 
Avatar de laurentschneider
 
Homme Laurent Schneider
Administrateur de base de données
Inscription : décembre 2005
Messages : 2 927
Détails du profil
Informations personnelles :
Nom : Homme Laurent Schneider
Localisation : Suisse

Informations professionnelles :
Activité : Administrateur de base de données
Secteur : Finance

Informations forums :
Inscription : décembre 2005
Messages : 2 927
Points : 4 549
Points : 4 549
si la table a subit des deletes et des inserts, alors les lignes ne sont plus dans l'ordre de ROWID, il se peut aussi que la table ait des extents non contigus, voire des extents dans différent fichiers.

Un explain plan et un select rowid pourra éventuellement te donner un indice sur la cause de tes soucis!
__________________
Mon blog : laurentschneider.com
Mon livre : Advanced Oracle SQL Programming
laurentschneider est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/05/2008, 15h37   #10
Membre chevronné
 
Avatar de philcero
 
Inscription : septembre 2007
Messages : 519
Détails du profil
Informations personnelles :
Âge : 40
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations forums :
Inscription : septembre 2007
Messages : 519
Points : 649
Points : 649
Je vais peut-être répondre à côté de la plaque mais quel est l'intérêt d'avoir les enregistrements d'une table dans un ordre jugé comme immuable si celui-ci ne l'est pas explicitement demandé à la base ?

Par extension, le fait que la fonction MoveNext() pré-citée plante doit peut-être être lié à autre chose. Pour ma part un curseur, que celui-ci soit en PL/SQL, en Java, en C ou je ne sais quoi d'autre reste un curseur et est censé apporter une certaine contractualité avec le contenu que retourne la base.

Autrement dit le problème ne viendrait-il pas plus tôt d'une mauvaise implémentation de ton API et non du driver utilisé ?
philcero est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/05/2008, 17h07   #11
Rédacteur/Modérateur
 
Avatar de orafrance
 
Inscription : janvier 2004
Messages : 15 861
Détails du profil
Informations personnelles :
Âge : 35

Informations forums :
Inscription : janvier 2004
Messages : 15 861
Points : 16 212
Points : 16 212
Par définition une table est un sac de billes, il n'y a donc aucun ordre garanti et en aucune manière le ROWID pourrait le garantir, en effet, un UPDATE ou MOVE suffit à le changer

A retenir : la norme impose de me pas ordonner les lignes d'une table
orafrance est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/05/2008, 17h10   #12
Expert Confirmé Sénior


 
Avatar de laurentschneider
 
Homme Laurent Schneider
Administrateur de base de données
Inscription : décembre 2005
Messages : 2 927
Détails du profil
Informations personnelles :
Nom : Homme Laurent Schneider
Localisation : Suisse

Informations professionnelles :
Activité : Administrateur de base de données
Secteur : Finance

Informations forums :
Inscription : décembre 2005
Messages : 2 927
Points : 4 549
Points : 4 549
Citation:
Envoyé par orafrance Voir le message
un UPDATE ou MOVE suffit à le changer, même une migration de ligne
Pourrais-tu détailler stpl?

C'est quoi une migration de ligne?
__________________
Mon blog : laurentschneider.com
Mon livre : Advanced Oracle SQL Programming
laurentschneider est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/05/2008, 17h20   #13
Rédacteur/Modérateur
 
Avatar de orafrance
 
Inscription : janvier 2004
Messages : 15 861
Détails du profil
Informations personnelles :
Âge : 35

Informations forums :
Inscription : janvier 2004
Messages : 15 861
Points : 16 212
Points : 16 212
C'est un chainage qui consiste à déplacer la ligne complète et laisser juste le pointeur dans le bloc d'origine. Si tu fais un update d'une ligne mais que le bloc n'a pas suffisamment d'espace libre pour faire cet update, alors la ligne complète est déplacer dans un nouveau bloc.

A ne pas confondre avec le chainage "simple" qui lui est difficilement coutournable puisqu'il consiste à répartir une ligne sur différent bloc si elle est plus grosse que le bloc (ou plutot le PCTUSED du bloc).

Edit : Pour approfondir le sujet : http://www.developpez.net/forums/d18358/bases-donnees/oracle/question-techniques-extents/

Particulièrement, la doc : http://download-west.oracle.com/docs...lock.htm#15915

PS : D'ailleurs, la doc corrige une bêtise que j'ai dite : la migration de ligne ne modifie pas le ROWID... au temps pour moi (J'ai donc supprimé cette précision fausse de mon post )
orafrance est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/05/2008, 17h42   #14
Expert Confirmé Sénior
 
Avatar de mnitu
 
Homme Marius Nitu
Ingénieur développement logiciels
Inscription : octobre 2007
Messages : 3 320
Détails du profil
Informations personnelles :
Nom : Homme Marius Nitu
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 : 3 320
Points : 5 839
Points : 5 839
Citation:
Envoyé par randriano Voir le message
...
Le count (nombre de records) résultant est de 14. En bouclant pour lire un à un les enregistrements, ça crash à la 7è boucle (toujours ordre dans le désordre) avec l'erreur: "BOF ou EOF est égal à True ou l'enregistrement actuel a été supprimé. L'opération demandée nécessite un enregistrement actuel."
Si je comprends bien il y a plutôt un problème dans l’algorithme que tu utilise : en général tu ne peut pas te baser sur le comptage des enregistrements fait avec un select count(*) pour ouvrir et lire les données dans un curseur. Plus explicitement, l’algorithme suivant est mauvais :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
 
declare
  cursor crs IS SELECT * FROM emp;
  l_cpt Number;
  l_rEmp emp%rowtype;
begin
  SELECT count(*) INTO l_cpt  FROM emp;
  Open crs;
  FOR i IN 1..l_cpt Loop
    Fetch crs INTO l_remp;
  End Loop;
  Close crs;
End;
mnitu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/05/2008, 08h08   #15
Membre chevronné
 
Avatar de randriano
 
Homme Rija Randriano
Inscription : janvier 2007
Messages : 984
Détails du profil
Informations personnelles :
Nom : Homme Rija Randriano
Localisation : Madagascar

Informations forums :
Inscription : janvier 2007
Messages : 984
Points : 729
Points : 729
Et oui mnitu, c'est comme ça que je fais mais sous ADO C++. Normalement, ça marche mais pour mon cas à la 7è record des 14, ça plante avec l'erreur que j'avais mis en rouge.

Citation:
Envoyé par philcero
quel est l'intérêt d'avoir les enregistrements d'une table dans un ordre jugé comme immuable si celui-ci ne l'est pas explicitement demandé à la base ?
Juste par curiosité !!
__________________
randriano.dvp.com
randriano est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/05/2008, 11h06   #16
Expert Confirmé Sénior
 
Avatar de mnitu
 
Homme Marius Nitu
Ingénieur développement logiciels
Inscription : octobre 2007
Messages : 3 320
Détails du profil
Informations personnelles :
Nom : Homme Marius Nitu
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 : 3 320
Points : 5 839
Points : 5 839
Peu importe que c'est ADO avec C++, PL/SQL, VB ou Java! L'algorithme est mauvais (oubliez complètement le order by dans cette hystoire)!
Citation:
Normalement ça marche...
Le monde est plein des bugs qui marchent "normalement"!
mnitu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/05/2008, 14h08   #17
Membre chevronné
 
Avatar de philcero
 
Inscription : septembre 2007
Messages : 519
Détails du profil
Informations personnelles :
Âge : 40
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations forums :
Inscription : septembre 2007
Messages : 519
Points : 649
Points : 649
Ca fait un bout de temps que j'ai pas fait du C++ mais si c'est faisable poste ton code, car pour moi le problème vient de là et pas d'ailleurs...
philcero est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/05/2008, 14h17   #18
Rédacteur/Modérateur
 
Avatar de orafrance
 
Inscription : janvier 2004
Messages : 15 861
Détails du profil
Informations personnelles :
Âge : 35

Informations forums :
Inscription : janvier 2004
Messages : 15 861
Points : 16 212
Points : 16 212
le problème vient de la requête et non du code C++
orafrance est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/05/2008, 09h33   #19
Membre chevronné
 
Avatar de randriano
 
Homme Rija Randriano
Inscription : janvier 2007
Messages : 984
Détails du profil
Informations personnelles :
Nom : Homme Rija Randriano
Localisation : Madagascar

Informations forums :
Inscription : janvier 2007
Messages : 984
Points : 729
Points : 729
Désolé de me manifester aussi tardivement.

Citation:
Envoyé par philcero
car pour moi le problème vient de là et pas d'ailleurs...
En effet, l'erreur ne vient pas du tout de la requête qui est très simple et correct mais du programme C++.
Aussi que ça soit même moi je n'arrive pas à comprendre, il s'avère que ça ne marche pas car j'ai changé les tabulations du code par rapport à l'ancien, j'ai enlevé les commentaires inutiles.
Citation:
Envoyé par philcero
si c'est faisable poste ton code
Désolé je ne peux pas pour l'instant mais il s'agit du CPP d'une classe pour questionner une bd. Entre l'ancienne et la nouvelle, seulement différence de tabulations et suppression de commentaires. Bon
__________________
randriano.dvp.com
randriano est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/05/2008, 14h57   #20
Membre chevronné
 
Avatar de randriano
 
Homme Rija Randriano
Inscription : janvier 2007
Messages : 984
Détails du profil
Informations personnelles :
Nom : Homme Rija Randriano
Localisation : Madagascar

Informations forums :
Inscription : janvier 2007
Messages : 984
Points : 729
Points : 729
Et ben, j'ai maintenant clairement identifié la source de l'erreur, c'est purement C++ et ADO!!
En fait, la lecture du recordset issu d'une requête Select crashe alors lorsque le tupe de curseur Internal::CursorLocationEnum des fonctions Open() est égal à Internal::adUseServer. Puis si je change en adUseClient, ça ne change pas car il fallait regénérer le projet C++ (nettoyer puis compiler) pour que le changement d'ADO soit pris en compte.
Et ben, il est bizarre l'ADO, le fait de toujours regénérer pour voir la modification du curseur
(car si je change ensuite en adUseServer, ça marche mais il faut regénérer pour voir que ça plante)
__________________
randriano.dvp.com
randriano est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 00h49.


 
 
 
 
Partenaires

Hébergement Web