Hola nuevamente, creo que tu solución funciona bien, pero si puedes obtener el nombre del CONSTRAINT afectado con el item CONSTRAINT_NAME como te sugería en el correo anterior, que pudiera ser unas de tus soluciones, por ejemplo:

CREATE TABLE alejandro
(
  col1 integer,
  col2 integer,
  CONSTRAINT alejandro_col1_key UNIQUE (col1),
  CONSTRAINT alejandro_col2_key UNIQUE (col2)
)

CREATE OR REPLACE FUNCTION insertar(int,int) RETURNS text AS $$
DECLARE
  text_var1 text;

BEGIN

   BEGIN
     INSERT INTO  alejandro  VALUES ($1,$2);
   EXCEPTION WHEN unique_violation THEN
    GET STACKED DIAGNOSTICS text_var1 = CONSTRAINT_NAME;
   RAISE exception  'La contraint afectada es %',text_var1;
   END;
   return 'OK';
END;
$$ LANGUAGE plpgsql;

si ejecuto
select insertar(1,2);

OK


si luego ejecuto
select insertar(1,10);

ERROR:  La contraint afectada es alejandro_col1_key



si ejecuto
select insertar(10,2);
ERROR:  La contraint afectada es alejandro_col2_key

saludos


El 12/20/2015 a las 2:23 PM, Alejandro Carrillo escribió:
Hola,

Si revisé pero no encontré nada acerca del objeto afectado, por ahora la única solución es:
when unique_violation then
GET STACKED DIAGNOSTICS l_RETURNED_SQLSTATE = RETURNED_SQLSTATE,
l_MESSAGE_TEXT = MESSAGE_TEXT,
l_PG_EXCEPTION_DETAIL= PG_EXCEPTION_DETAIL;
if position('uk_cliente' in l_MESSAGE_TEXT)> 0 then
s_error_msj:= 'Ya existe un tipo_documento y numero_documento que coinciden con los ingresados. Por favor ingrese un tipo y documento diferentes o solicite restaurar la contraseña.';
end if;
raise exception '%', s_error_msj;



El Sábado 19 de diciembre de 2015 15:08, Anthony Sotolongo <asotolo...@gmail.com> escribió:



    Hola Alejandro, revisa los Error Diagnostics Values y tal vez te
    pueda dar la pista de la UNIQUE que te da el error, utiliza el
    ITEM que requieras(creo que COLUMN_NAME o CONSTRAINT_NAME o
    PG_EXCEPTION_DETAIL o PG_EXCEPTION_HINT, pueden ayudarte).
    te recomiendo:
    
http://www.postgresql.org/docs/9.4/interactive/plpgsql-control-structures.html#PLPGSQL-ERROR-TRAPPING


    Saludos


    El 12/19/2015 a las 3:04 PM, Alejandro Carrillo escribió:
    Buen dia,

    Rato sin hablar en la lista.
    Tengo una duda, estoy creando un function en Postgresql 9.4 que
    insertará datos en una tabla, sin embargo esta tabla tiene 2 o
    más unique constraint y necesito saber unicamente el nombre de
    cual de las unique constraint ha sido afectada, ej:


    create or replace function insertar(
    p1 character varying,
     p2 character varying,
      p3 character varying
     )
    RETURNS void AS
    $$
    begin
    inser into ...;

    exception
    when unique_violation then
    -- ACA DEBO OBTENER UNICAMENTE EL NOMBRE EXACTO DE LA UNIQUE KEY
    AFECTADA para efectos de mostrar un mensaje de error personalizado.
    end;
    $$;

    Cordial saludo




Responder a