|
Publicité ' | ||||||||||||||||||||||||
|
|
#1 |
|
Membre chevronné
![]() ![]() Rija RandrianoInscription : janvier 2007 Messages : 984 ![]() |
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 |
|
|
00
|
|
|
#2 |
![]() ![]() vincent rogier Inscription : juillet 2007 Messages : 2 355 ![]() |
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 |
|
00
|
|
|
#3 |
|
Membre chevronné
![]() Inscription : septembre 2007 Messages : 519 ![]() |
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 |
|
|
00
|
|
|
#4 | |
|
Membre chevronné
![]() ![]() Rija RandrianoInscription : janvier 2007 Messages : 984 ![]() |
Citation:
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 |
|
|
|
00
|
|
|
#5 |
|
Expert Confirmé Sénior
![]() Inscription : juillet 2003 Messages : 3 459 ![]() |
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 |
|
|
00
|
|
|
#6 |
|
Membre chevronné
![]() ![]() Rija RandrianoInscription : janvier 2007 Messages : 984 ![]() |
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 |
|
|
00
|
|
|
#7 |
|
Expert Confirmé Sénior
![]() ![]() ![]() Laurent SchneiderAdministrateur de base de données Inscription : décembre 2005 Messages : 2 927 ![]() |
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 |
|
00
|
|
|
#8 | |
|
Membre chevronné
![]() ![]() Rija RandrianoInscription : janvier 2007 Messages : 984 ![]() |
Citation:
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 |
|
|
|
00
|
|
|
#9 |
|
Expert Confirmé Sénior
![]() ![]() ![]() Laurent SchneiderAdministrateur de base de données Inscription : décembre 2005 Messages : 2 927 ![]() |
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! |
|
00
|
|
|
#10 |
|
Membre chevronné
![]() Inscription : septembre 2007 Messages : 519 ![]() |
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é ? |
|
|
00
|
|
|
#11 |
![]() ![]() Inscription : janvier 2004 Messages : 15 861 ![]() |
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 |
|
|
00
|
|
|
#12 |
|
Expert Confirmé Sénior
![]() ![]() ![]() Laurent SchneiderAdministrateur de base de données Inscription : décembre 2005 Messages : 2 927 ![]() |
Pourrais-tu détailler stpl?
C'est quoi une migration de ligne? |
|
00
|
|
|
#13 |
![]() ![]() Inscription : janvier 2004 Messages : 15 861 ![]() |
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 |
|
|
00
|
|
|
#14 | |||
|
Expert Confirmé Sénior
![]() ![]() Marius NituIngénieur développement logiciels Inscription : octobre 2007 Messages : 3 320 ![]() |
Citation:
Code :
|
|||
|
|
00
|
|
|
#15 | |
|
Membre chevronné
![]() ![]() Rija RandrianoInscription : janvier 2007 Messages : 984 ![]() |
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:
__________________
randriano.dvp.com |
|
|
|
00
|
|
|
#16 | |
|
Expert Confirmé Sénior
![]() ![]() Marius NituIngénieur développement logiciels Inscription : octobre 2007 Messages : 3 320 ![]() |
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:
|
|
|
|
00
|
|
|
#17 |
|
Membre chevronné
![]() Inscription : septembre 2007 Messages : 519 ![]() |
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...
|
|
|
00
|
|
|
#18 |
![]() ![]() Inscription : janvier 2004 Messages : 15 861 ![]() |
le problème vient de la requête et non du code C++
|
|
|
00
|
|
|
#19 | ||
|
Membre chevronné
![]() ![]() Rija RandrianoInscription : janvier 2007 Messages : 984 ![]() |
Désolé de me manifester aussi tardivement.
Citation:
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:
__________________
randriano.dvp.com |
||
|
|
00
|
|
|
#20 |
|
Membre chevronné
![]() ![]() Rija RandrianoInscription : janvier 2007 Messages : 984 ![]() |
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 |
|
|
00
|
Copyright © 2000-2012 - www.developpez.com