| From: | Alejandro Carrillo <fasterzip(at)yahoo(dot)es> | 
|---|---|
| To: | Anthony Sotolongo <asotolongo(at)gmail(dot)com>, Lista Postgres ES <pgsql-es-ayuda(at)postgresql(dot)org> | 
| Subject: | Re: Capturar cual unique key esta en excepción | 
| Date: | 2016-01-26 05:18:22 | 
| Message-ID: | 1385763631.120955.1453785502898.JavaMail.yahoo@mail.yahoo.com | 
| Views: | Whole Thread | Raw Message | Download mbox | Resend email | 
| Thread: | |
| Lists: | pgsql-es-ayuda | 
Muchas gracias por la solución. Cambiaré mis fuentes ya q es más optima que buscando textos
    El Domingo 20 de diciembre de 2015 13:00, Anthony Sotolongo <asotolongo(at)gmail(dot)com> escribió:
 
 
  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  
  
   
 
  
     
 
 
 
  
| From | Date | Subject | |
|---|---|---|---|
| Next Message | Eduardo Villagrán Morales | 2016-01-26 11:29:10 | RE: no conecta pc con Win XP | 
| Previous Message | Ivan Perales M. | 2016-01-25 18:24:15 | Re: no conecta pc con Win XP |