Oracle INSERT INTO SELECT(...) DUP_VAL_ON_INDEX comportement des exceptions
J'ai une procédure stockée qui ressemble à ceci:
BEGIN
INSERT INTO result_table
(SELECT (...) FROM query_table);
EXCEPTION
WHEN DUP_VAL_ON_INDEX THEN
NULL;
END;
Je vais le faire dans une boucle qui passe plusieurs paramètres de l'instruction SELECT et, dans certains cas, certaines valeurs peuvent dupliquer c'est pourquoi je dois prendre le DUP_VAL_ON_INDEX exception.
Ma question est que si l'instruction SELECT retourne plusieurs lignes et seulement l'un d'eux existe déjà dans *result_table*, f l'est. ex.
1 'A'
2 'B'
3 'C'
Et de la première rangée (de 1 'A') serait déjà dans la table, les autres lignes qui n'existent pas (deuxième et troisième à partir de cas ci-dessus) être inséré? Ou aucun d'entre eux serait inséré à tous?
J'ai peur qu'aucun d'entre eux serait inséré (et mon cas de test partiellement confirme que)... Si oui, quelle option dois-je atteindre les objectifs souhaités de comportement? Est-il un bon moyen pour insérer les lignes qui ne viole pas la clé primaire à l'aide de la construction ci-dessus?
Vous devez vous connecter pour publier un commentaire.
Vous pouvez utiliser le
MERGE
déclaration. Insérer les enregistrements s'ils n'existent pas et de ne rien faire s'ils existent déjà.http://psoug.org/reference/merge.html
Vous avez raison, si un enregistrement viole la contrainte, aucun ne sera inséré.
Je ferais
Une autre option est d'utiliser la journalisation des erreurs
Remarque: vous devez créer d'erreur de la table avant d'exécuter cette requête.
LOCK result_table IN SHARE ROW EXCLUSIVE MODE
et ensuite faire votre insert (attention : personne d'autre ne peut mettre à jour/supprimer/insérer une ligne tout en vous tenant lock).Si vous utilisez 11g, vous pouvez utiliser le
ignore_row_on_dupkey_index
astuce pour supprimer les erreurs: