Z this a this Myslím, že pro ORA-00955 neexistují žádné předdefinované pojmenované systémové výjimky.
Jak mohu přepsat následující, abych zachytil pouze chybu ORA-00955?
begin
EXECUTE IMMEDIATE 'CREATE SEQUENCE S_TEST START WITH 1 INCREMENT BY 1';
exception when OTHERS then
Null;
end;
BTW Existuje nějaká syntaxe k zachycení chyb pouhým poskytnutím chybových kódů?
Máte dvě možnosti:
Výjimku najdete přímo podle čísla:
BEGIN
EXECUTE IMMEDIATE 'CREATE SEQUENCE S_TEST START WITH 1 INCREMENT BY 1';
EXCEPTION
WHEN OTHERS THEN
IF SQLCODE = -955 THEN
NULL; -- suppresses ORA-00955 exception
ELSE
RAISE;
END IF;
END;
Další možností je použít EXCEPTION_INIT
Direktiva Pragma, aby svázala známé číslo chyby Oracle s uživatelem definovanou výjimkou;
DECLARE
name_in_use exception; --declare a user defined exception
pragma exception_init( name_in_use, -955 ); --bind the error code to the above
BEGIN
EXECUTE IMMEDIATE 'CREATE SEQUENCE S_TEST START WITH 1 INCREMENT BY 1';
EXCEPTION
when name_in_use then
null; --suppress ORA-00955 exception
END;
BTW Existuje nějaká syntaxe k zachycení chyb pouhým poskytnutím chybových kódů?
Ano, demonstroval jsem to v prvním příkladu
Další čtení pro variace na toto:
Podobné tomu, co již Sathya navrhla, ale ráda se vyhýbám when others
úplně pokud je to možné - neošetřená výjimka je obvykle správným výsledkem pro výjimky, se kterými se konkrétně nezabýváte:
create sequence foo;
/*
sequence FOO created.
*/
declare
name_is_already_used_955 exception;
pragma exception_init(name_is_already_used_955,-955);
begin
execute immediate 'create sequence foo';
exception when name_is_already_used_955 then null;
end;
/
/*
anonymous block completed
*/