Odwołaj się do wyjątku bezpośrednio według numeru:
BEGINEXECUTE IMMEDIATE 'CREATE SEQUENCE S_TEST START WITH 1 INCREMENT BY 1';
EXCEPTION
WHEN OTHERS THENIF SQLCODE =-955THENNULL;-- suppresses ORA-00955 exceptionELSE
RAISE;ENDIF;END;
Inną opcją jest użycie EXCEPTION_INITdyrektywy Pragma do powiązania znanego numeru błędu Oracle z wyjątkiem zdefiniowanym przez użytkownika;
DECLARE
name_in_use exception;--declare a user defined exception
pragma exception_init( name_in_use,-955);--bind the error code to the above BEGINEXECUTE IMMEDIATE 'CREATE SEQUENCE S_TEST START WITH 1 INCREMENT BY 1';
EXCEPTION
when name_in_use thennull;--suppress ORA-00955 exceptionEND;
BTW Czy istnieje jakaś składnia do wychwytywania błędów po prostu poprzez podanie kodów błędów?
czy nie mogę po prostu przejść bez tego, kiedy inni podnoszą linie?
bernd_k,
@bernd_k tak, robisz to, jest to jednak nieobsługiwany wyjątek
Sathyajith Bhat,
2
Proszę dodać podwyżkę w KIEDY INNY, gdy sqlcodeNIE jest 955 =)
Vincent Malgrat
OP może nadal chcieć zgłaszać inne błędy. Twój blok wyjątków „tak jak jest” zachowuje się dokładnie tak, JAK INNY NIŻ NULL. Myślę, że OP chce czegoś bardziej precyzyjnego i subtelnego.
Vincent Malgrat,
@VincentMalgrat Masz rację.
Sathyajith Bhat,
5
Podobne do tego, co już zasugerował Sathya, ale lubię when otherscałkowicie unikać, jeśli to możliwe - nieobsługiwany wyjątek jest zwykle prawidłowym wynikiem dla wyjątków, z którymi konkretnie nie postępujesz:
sqlcode
NIE jest 955 =)Podobne do tego, co już zasugerował Sathya, ale lubię
when others
całkowicie unikać, jeśli to możliwe - nieobsługiwany wyjątek jest zwykle prawidłowym wynikiem dla wyjątków, z którymi konkretnie nie postępujesz:źródło