2011-08-28 14 views
7

Estoy usando el desarrollador sql, y he agregado una restricción a una de mis tablas.Capturando una violación de restricción en psql

constraint valid_gender check(gender in ('M','F','I','T')) 

Cuando intento agregar una entrada con digamos 'x' para el género usando un procedimiento plsql, falla con violación de restricción (como debería).

Quiero agregar un "Catch" al procedimiento plsql de modo que si valid_gender está volado, puedo raise_application_error específico para él. es posible?

Respuesta

8

Oracle lanzará una excepción que dice:

ORA-02290: restricción de comprobación (yourschema.valid_gender) violado

Puede superarán a las de un controlador de excepciones y elevar su propia excepción vez usando raise_application_error en un par de formas.

1) Puede específicamente trampa excepción ORA-02290 de esta manera:

declare 
    e_check_violated exception 
    pragma exception_init (e_check_violated, -2290); 
begin 
    insert ... 
exception 
    when e_check_violated then 
    if sqlerrm like '%(yourschema.valid_gender)%' then 
     raise_application_error(-20001,'Invalid gender'); 
    else 
     raise; 
    end if; 
end; 

2) Puede interceptar todas las excepciones y les inspeccionar:

begin 
    insert ... 
exception 
    when others then 
    if sqlerrm like 'ORA-02290:%(yourschema.valid_gender)%' then 
     raise_application_error(-20001,'Invalid gender'); 
    else 
     raise; 
    end if; 
end; 

En una aplicación de gran tamaño es bastante Es común tener un procedimiento de manejo de excepciones para generalizar esto y buscar el mensaje específico de restricción en una tabla.

+0

gracias mucho – luke

+0

que sería 2 o 3 si pudiera :) –

+0

esta es una respuesta más apropiada, gracias – chulian

0

Se podía probarlo primero:

if gender_value not in ('M','F','I','T') then 
    raise_application_error... 
end if; 
0

uso bloque anónimo en su código ...

BEGIN 
    INSERT or update... 

    EXCEPTION 
    WHEN dup_val_on_index THEN 
    RISE... 

    END; 
Cuestiones relacionadas