Re: Capturar cual unique key esta en excepción

From: Anthony Sotolongo <asotolongo(at)gmail(dot)com>
To: Alejandro Carrillo <fasterzip(at)yahoo(dot)es>, Lista Postgres ES <pgsql-es-ayuda(at)postgresql(dot)org>
Subject: Re: Capturar cual unique key esta en excepción
Date: 2015-12-20 17:59:30
Message-ID: 5676EC82.3060209@gmail.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-es-ayuda

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
> <asotolongo(at)gmail(dot)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
>
>
>

In response to

Responses

Browse pgsql-es-ayuda by date

  From Date Subject
Next Message Yoan Manuel Pérez Piñero 2015-12-21 14:12:43 Re: [MASSMAIL] Problemas réplica 9.4 con londiste3
Previous Message Alejandro Carrillo 2015-12-20 17:23:00 Re: Capturar cual unique key esta en excepción