Je repérer des erreurs d'une opération d'insertion en bloc comme ceci:erreurs Oracle DML manquent de détails
begin
--bulk insert
forall i in v_data.first .. v_data.last save exceptions
insert into my_filter_table values v_data (i);
commit;
exception
-- catch and print the saved-up DML errors.
when X_DML_ERRORS then
declare
v_iteration number;
begin
dbms_output.put_line('');
dbms_output.put_line('DML Errors:');
for i in 1 .. SQL%BULK_EXCEPTIONS.count loop
v_iteration := SQL%BULK_EXCEPTIONS(i).error_index;
dbms_output.put_line('Iteration: '||v_iteration||' Message: '||
SQLERRM(-SQL%BULK_EXCEPTIONS(i).ERROR_CODE));
end loop;
end;
end;
La sortie ressemble à ceci:
Iteration: 3 Message: ORA-01400: cannot insert NULL into() Iteration: 4 Message: ORA-02290: check constraint (.) violated Iteration: 8 Message: ORA-00001: unique constraint (.) violated
Le fait que je reçois des erreurs ne ne me dérange pas, car je teste le code de gestion des erreurs. Le problème est que le message d'erreur Oracle n'affiche pas les noms des contraintes, c'est-à-dire qu'il affiche check constraint (.) violated
mais cela ne me dit pas QUELLE contrainte de vérification j'ai violée.
Est-ce que quelqu'un sait quoi de neuf?
(version Oracle 10.2)
Emge @ Daniel: Hmmm ouais ce sens. Tirer! Je suppose que% BULK_EXCEPTIONS ne stocke pas les détails de l'erreur spécifique, ce que j'essaie de faire n'est probablement pas possible. – FrustratedWithFormsDesigner
J'ai pensé à une solution de contournement. Vous pouvez réexécuter l'instruction dans le gestionnaire d'exceptions pour chaque ligne ayant échoué. Vous pouvez alors attraper cette exception qui aura le nom de la contrainte. –
Hey c'est assez intelligent! Merci! :) – FrustratedWithFormsDesigner