|
Publicité ' | |||||||||||||||||||||||
|
|
#1 |
|
Invité régulier
![]() Inscription : décembre 2004 Messages : 60 ![]() |
Bonjour,
j'ai une question qui je pense n'a pas été abordée comme je veux, j'espere trouver une réponse ou plutôt des pistes. je fais une jointure sur 2 tables Code :
SELECT * FROM T1, T2 WHERE T1.X=T2.Y AND... le besoin est de faire ca en plusieurs étapes (ou plutôt en plusieurs intervalles de temps d'exécution), et le but est donc de reprendre à la dernière ligne traitée lors de la dernière exécution. un mécanisme est en place pour stocker le nombre de lignes (de la jointure) traités, et de reprendre à ce nombre lors du traitement suivant. si la table T2 ne bouge pas entre 2 exécutions, il n'y a pas de souci, par contre le risque est bien présent comme les insertions se font sur des jours d'intervalles. (évidemment T1 reste inchangée pendant tout ce temps) dans le cas ou T2 bouge, la jointure pourrait ramener soit des lignes en plus soit en moins. et donc la reprise ne se fait probablement pas au bon endroit. est ce qu'il existe un moyen de réaliser ceci tout en gardant la boucle inchangée, en modifiant juste la requête principale, le but est de reprendre à la dernière ligne de T1 surtout. le dernier recours est évidemment la boucle sur T1, et l'appel à T2 dedans. Merci d'avance |
|
|
00
|
|
|
#2 |
|
Expert Confirmé Sénior
![]() ![]() Marius NituIngénieur développement logiciels Inscription : octobre 2007 Messages : 3 311 ![]() |
Vous avez besoin d’un mécanisme pour savoir ce que vous avez traité. Sinon, jointure ou pas votre traitement sera défaillant.
|
|
|
00
|
|
|
#3 |
|
Invité régulier
![]() Inscription : décembre 2004 Messages : 60 ![]() |
J'ai pensé passer par les ROWID de T1, mais ca implique pas mal de vérification (surtout si mon ROWID de référence disparait dans la jointure du lancement suivant par mal chance)
au détriment de la précision je pense que je vais passer au niveau macro, et n'arrêter qu'à la fin de chaque partition (64). ca dépassera mes compteurs mais je prendrai une marge d'avance pour être sûr, ca reste la solution la plus propre. mais une question : est ce qu'une table renvoie des ROWID (on va dire sans aucune clause ni tri) dans l'ordre alphabétique ou pas? et si elle n'a pas été modifiée, s'agit-il certainement du même ordre à chaque même requête (je pense que oui mais j'ai des doutes) Merci |
|
|
00
|
|
|
#4 |
|
Membre Expert
![]() Inscription : avril 2006 Messages : 1 024 ![]() |
Oracle ne garanti aucun ordre de renvoi de lignes tant qu'il n'y a pas de clause "order by". Meme si de manière empirique tu aura l'impression qu'un ordre est toujours de mise, attention bien souvent ça dépend du plan d'exécution, et celui ci peu être amené à changer. Si oracle fait du parallélisme, là aussi, tout est chamboulé... bref, si tu veux un ordre, fait un "order by"
Sinon, oracle te garanti la consistance de tes données quand tu ouvres un curseur, mais si tu laisses un curseur ouvert trop longtemps, tu vas avoir des problèmes (erreur "snapshot too old") Si tu veux faire des traitement par lot sur plusieurs jours, il est bien plus prudent de trouver des moyen applicatifs (colonnes pour flaguer les données traitées, tables temporaires etc...) |
|
|
10
|
|
|
#5 |
|
Invité régulier
![]() Inscription : décembre 2004 Messages : 60 ![]() |
Merci pour ces précisions.
|
|
|
00
|
Copyright © 2000-2012 - www.developpez.com