INSÉREZ à l'ORDRE sur Oracle
Sur Oracle 10g nous avons besoin d'insérer des enregistrements à partir d'un affichage dans un tableau à l'appui d'un client sourd-muet application qui n'a pas de tri ou les options de lui-même. Est-il possible de contrôler l'ordre dans lequel notre instruction INSERT ajoute des enregistrements à la table de destination?
Pourquoi avez-vous besoin? Est-il un déclencheur qui fait quelque chose sur insérer?
Liées à la stackoverflow.com/questions/33841234/...
Si c'est comme ce que je devais faire avec un Pays tableau, on pourrait avoir des dossiers qui sera liée à une liste déroulante ou zone de liste sur une page web, et le désir à tous dans l'ordre alphabétique par nom, plutôt que l'ordre numérique par ID, et ont de nouveaux enregistrements qui ont été ajoutés après coup ou en raison des événements actuels et de commande, ainsi que de re-codage des pages pour avoir trié des listes déroulantes/zones de liste, quand vous pouvez juste le fixer dans la base de données, à la place.
lire la première ligne de la réponse choisie - sans un "ORDER BY" vous ne pouvez pas savoir dans quel ordre Oracle renvoie les enregistrements, même si vous l'insérez dans l'ordre de tri. La réponse est âgé de sept ans, et il est encore valide.
ne peut pas savoir dans quel ordre Oracle renvoie les enregistrements, même si vous l'insérez dans l'ordre de tri" -- B. S. Comment sur le fait d'essayer de ma réponse, j'ai posté ci-dessous. Avez-vous été le downvoter? J'ai prouvé que je pouvais le faire. Oui,
Liées à la stackoverflow.com/questions/33841234/...
Si c'est comme ce que je devais faire avec un Pays tableau, on pourrait avoir des dossiers qui sera liée à une liste déroulante ou zone de liste sur une page web, et le désir à tous dans l'ordre alphabétique par nom, plutôt que l'ordre numérique par ID, et ont de nouveaux enregistrements qui ont été ajoutés après coup ou en raison des événements actuels et de commande, ainsi que de re-codage des pages pour avoir trié des listes déroulantes/zones de liste, quand vous pouvez juste le fixer dans la base de données, à la place.
lire la première ligne de la réponse choisie - sans un "ORDER BY" vous ne pouvez pas savoir dans quel ordre Oracle renvoie les enregistrements, même si vous l'insérez dans l'ordre de tri. La réponse est âgé de sept ans, et il est encore valide.
ne peut pas savoir dans quel ordre Oracle renvoie les enregistrements, même si vous l'insérez dans l'ordre de tri" -- B. S. Comment sur le fait d'essayer de ma réponse, j'ai posté ci-dessous. Avez-vous été le downvoter? J'ai prouvé que je pouvais le faire. Oui,
ORDER BY
ne sont appliquées sur une normale INSERT
. Ajouter le /*+APPEND*/
de l'indice de la accepté de répondre (ce qu'il a rejeté, c'est pourquoi j'ai voté son vers le bas et ajouté mon propre exemple, où il a travaillé), et voilà, ça fonctionne! C'est pourquoi ORDER BY
existe, en premier lieu -, si vous ajoutez les lignes dans l'ordre où ils ont trouvé, c'est comment vous pouvez contrôler vos insertions.OriginalL'auteur Stuart Ellis | 2009-08-27
Vous devez vous connecter pour publier un commentaire.
Vous pouvez pas fiable de contrôle dans quel ordre Oracle récupérer la ligne d'une table sans un
ORDER BY
.En outre, sans les
/*+APPEND*/
soupçon, Oracle va stocker les lignes physiquement dans un tas de table où il y a de la place, qui ne peut être à la fin de la table ! Vous pouvez penser Oracle insère de façon séquentielle, mais tout DML ou de l'activité simultanée (2+ séances d'insertion) peut produire une autre organisation.Vous pouvez utiliser un INDEX ORGANISÉ table pour stocker les lignes dans l'ordre de la PK. La plupart des requêtes simples, par la suite, sur la table qui va produire un ensemble trié de lignes. Ce ne serait toutefois pas garantir que oracle va sélectionner les lignes dans l'ordre si vous ne spécifiez pas une COMMANDE PAR (en fonction de la requête et le chemin d'accès, les lignes peuvent venir dans n'importe quel ordre).
Vous pouvez également utiliser une vue à l'ordre, c'est probablement votre meilleur pari si vous ne pouvez pas toucher à la demande (le renommer la table, créer une vue avec le nom de la table, laisser l'application pense qu'il interroge la table). Je ne sais pas si cela est possible dans votre cas.
+1 pour l'envoi de la droite avertissements
+1 pour l'utilisation d'un point de vue. Je ne pense pas que l'IDO est une bonne idée.
"vous ne pouvez pas contrôler de manière fiable le dans quel ordre Oracle stocke les lignes physiquement dans un tas de table" ... pas tout à fait vrai, je pense. Un chemin direct insérer permettrait de préserver l'ordre physique dans les extensions, donc il peut être utilisé pour améliorer les données de segment de compression. Quelque chose de spécialisé cas, et bien sûr sélectionnez order by n'est pas du tout garanti.
-1 Devraient avoir dit comment utiliser le
/*+APPEND*/
soupçon, non seulement fait allusion à elle, puis il a rejeté. C'est en fait la réponse sur la façon de le faire! A bien fonctionné pour moi!OriginalL'auteur Vincent Malgrat
Sauf si vous spécifiez un ORDRE, on ne peut jamais garantir l'ordre dans lequel Oracle retourne des lignes à partir d'une sélection de
OriginalL'auteur cagcowboy
Il suffit d'utiliser une COMMANDE PAR. Quelque chose comme
MODIFIER, cela ne fonctionne pas réellement. Vous pouvez créer une situation temporaire avec les lignes dans l'ordre approprié, puis l'insérer.
OriginalL'auteur fras
Votre problème principal, celui de votre application, non pas de l'ajout d'une COMMANDE PAR à sa requête, peut être résolu par l'utilisation d'un index sur la colonne(s) que vous souhaitez commander, puis utilisez un plan à cause de la requête à utiliser l'index pour accéder à la table.
Vous auriez à tester pour voir si cela va fonctionner ou pas - il faut savoir qu'il est peut-être pas assez pour juste ajouter un INDEX() de l'indice, car l'optimiseur peut trouver une façon de rendre hommage à l'indice, tandis que pas accès à l'index dans l'ordre; et si la requête se joint à d'autres tables de la commande peut être perdu de toute façon.
OriginalL'auteur Jeffrey Kemp
OUI, il y EST un moyen de contrôler votre commande. J'ai trouvé grâce à l'expérience où j'avais une table de Pays, nous allons l'appeler
OLD_COUNTRIES
, qui ressemblait à ceci:Où je voulais que les éléments qui ont été ajoutés après la liste des pays (comme les Açores et les autres îles qui ont été ajoutés plus tard) pour réellement s'affichent dans l'ordre alphabétique avec le reste du pays quand je l'ai inséré dans un nouveau tableau:
J'ai ensuite couru ce qu'il vous faut:
Et mon nouveau
COUNTRIES
table est venu par ordre alphabétique par nom de l'amende juste.NOTE:
COMMIT
est requis ou si vous obtenez l'erreur:ORA-12838: cannot read/modify an object after modifying it in parallel
lorsque vous essayez d'ouvrir la table de la regarder dans Oracle SQL Developer.NOTE: Si vous n'utilisez pas
/*+ append */
, il ne sera pas insérer dans l'ordre que vous spécifiez - il ignorerORDER BY
. Et je sais qu'il a utilisé monORDER BY
lorsque j'ai utilisé/*+ append */
et pas seulement par défaut, une clé primaire sur l'ancien ou le nouveau tables de, car aucun d'eux n'avait les clés primaires.Mise en garde: Selon la accepté de répondre à l'auteur, l'ajout de l'indice, comme avec "tout DML ou simultanée de l'activité...peut produire une autre organisation". Alors que peut-être vrai, ne le faites pas, toutes les opérations en cours et d'un
COMMIT
déclaration dans votre code où je ne, de sorte que cela n'arrive pas!. . Une démonstration que le code fonctionne une fois n'est pas une garantie qu'il fonctionne toujours. Ce serait comme dire que parce que
2 + 2
est4
, en ajoutant tout entier en lui-même est toujours4
.Oui, mais étant donné que les conditions que j'ai mis ci-dessus sont presque toujours les mêmes (toujours "2" dans votre exemple, et non "3", etc.), il doit presque toujours. Le "presque toujours" mise en garde permet de pour ces scénarios, quand les gens sont à l'aide de "3", alors qu'ils devraient être à l'aide de "2": ex. vous ne pouvez pas exécuter des scripts dans des tableaux tels qu'ils sont modifiés, & s'attendre à des résultats parfaits. Vous ne pouvez pas exécuter des scripts sur des tables de source pour la copie de données si les gens sont à l'injection de la source de données. Ces sortes de choses devrait aller sans dire. Verrouiller les choses ou de créer des copies, puis remplacer par les copies que vous faites.
OriginalL'auteur vapcguy