Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » Oracle »

inserción con control de integridad

Estas en el tema de inserción con control de integridad en el foro de Oracle en Foros del Web. Buenas a todos, es la primera vez que escribo en un foro y mi problema es el siguiente: - estoy utilizando un cursor en pl/sql ...
  #1 (permalink)  
Antiguo 08/10/2009, 05:01
 
Fecha de Ingreso: octubre-2009
Mensajes: 5
Antigüedad: 11 años
Puntos: 0
inserción con control de integridad

Buenas a todos,
es la primera vez que escribo en un foro y mi problema es el siguiente:

- estoy utilizando un cursor en pl/sql para leer de varias tablas e insertar en otra, la tabla destino tiene claves foráneas y no se como hacer para que me inserte los registros que me cumpla la clave foránea y los que no la cumplan no se inserten y me salga un mensaje.

De momento tengo lo siguiente:

DECLARE CURSOR cprueba IS

SELECT a.campo reg1, b.campo reg2
FROM tablaA a, tablaB b

cprueba_rec cprueba%ROWTYPE;
BEGIN
FOR cprueba_rec IN cprueba

LOOP
INSERT INTO tablaC
(campoA, campoB)
VALUES (cprueba_rec.reg1,
cprueba_rec.reg1);
END LOOP;
END;

(donde tablaC.campoA y tablaC.campoB son claves foráneas)

Aunque hay registros que cumplen esas claves foráneas no me inserta nada y me sale el siguiente mensaje:

ORA-02291: restricción de integridad (FK_campoB) violada - clave principal no encontrada

Les doy las gracias de antemano.

Saludos.
  #2 (permalink)  
Antiguo 08/10/2009, 07:18
Avatar de huesos52
Colaborador
 
Fecha de Ingreso: febrero-2009
Ubicación: Manizales - Colombia
Mensajes: 5.980
Antigüedad: 11 años, 8 meses
Puntos: 360
Respuesta: inserción con control de integridad

Cita:
Aunque hay registros que cumplen esas claves foráneas no me inserta nada y me sale el siguiente mensaje:
haz la prueba solo con registros que cumplan la integridad referencial. Con uno solo que la viole se cae la ejecución de la función.
__________________
Without data, You are another person with an opinion.
W. Edwads Deming
  #3 (permalink)  
Antiguo 08/10/2009, 07:38
 
Fecha de Ingreso: junio-2007
Mensajes: 891
Antigüedad: 13 años, 4 meses
Puntos: 43
Respuesta: inserción con control de integridad

LOOP
begin
INSERT INTO tablaC
(campoA, campoB)
VALUES (cprueba_rec.reg1,
cprueba_rec.reg1);
exception
when others then LOQUESEA;
end;

END LOOP;
  #4 (permalink)  
Antiguo 08/10/2009, 08:45
 
Fecha de Ingreso: octubre-2009
Mensajes: 5
Antigüedad: 11 años
Puntos: 0
Respuesta: inserción con control de integridad

Primero que todo gracias por responder.

huesos52:
si pruebo solo con registros que cumplen la integridad funciona correctamente, lo que yo quiero es que cuando hayan registros que no cumplan la integridad me saque un excepción y continúe con la inserción.

jc3000:
Gracias!! Sabia que había una solución directa y la tuya ha funcionado perfectamente!!

Última edición por ostraspedrin2000; 08/10/2009 a las 08:55
  #5 (permalink)  
Antiguo 08/10/2009, 09:41
 
Fecha de Ingreso: junio-2007
Mensajes: 891
Antigüedad: 13 años, 4 meses
Puntos: 43
Respuesta: inserción con control de integridad

Esto que te he puesto te ralentiza el proceso.
Lo que puedes hacer es validar en el cursor que el campo padre exista, algo del tipo de :

SELECT a.campo reg1, b.campo reg2
FROM tablaA a, tablaB b
where campo_fk in ( select campo_padre from table_padre )

De todas maneras, el cursor ,a no ser que quieras como resultado un producto cartesiano esta mal.

Haces una join de dos tablas sin where...........
  #6 (permalink)  
Antiguo 14/10/2009, 04:07
 
Fecha de Ingreso: octubre-2009
Mensajes: 5
Antigüedad: 11 años
Puntos: 0
Respuesta: inserción con control de integridad

Al final he seguido tu consejo y he terminado con una INSERT rápida del tipo:

INSERT INTO tablaA a (a.campoA, a.campoB)
SELECT b.campoA, b.campoB
FROM tablaB b
WHERE b.campoA IN (SELECT campoA FROM tablaC)
AND b.campoB IN (SELECT campoA FROM tablaD);

La INSERT funciona correctamente con un tiempo aceptable.

Muchas gracias.
  #7 (permalink)  
Antiguo 15/10/2009, 02:16
 
Fecha de Ingreso: octubre-2009
Mensajes: 5
Antigüedad: 11 años
Puntos: 0
Respuesta: inserción con control de integridad

Cita:
Iniciado por ostraspedrin2000 Ver Mensaje
Al final he seguido tu consejo y he terminado con una INSERT rápida del tipo:

INSERT INTO tablaA a (a.campoA, a.campoB)
SELECT b.campoA, b.campoB
FROM tablaB b
WHERE b.campoA IN (SELECT campoA FROM tablaC)
AND b.campoB IN (SELECT campoA FROM tablaD);

La INSERT funciona correctamente con un tiempo aceptable.

Muchas gracias.
El problema de esta solución es que cuando el campoA o el campoB de la tablaB está vacío no me sube ningún registro.

Alguna idea?

Gracias.
  #8 (permalink)  
Antiguo 15/10/2009, 02:40
 
Fecha de Ingreso: octubre-2009
Mensajes: 5
Antigüedad: 11 años
Puntos: 0
Respuesta: inserción con control de integridad

Cita:
Iniciado por ostraspedrin2000 Ver Mensaje
El problema de esta solución es que cuando el campoA o el campoB de la tablaB está vacío no me sube ningún registro.

Alguna idea?

Gracias.
Yo me lo guiso, yo me lo como.

Mi solución a mi problema:

INSERT INTO tablaA a (a.campoA, a.campoB)
SELECT b.campoA, b.campoB
FROM tablaB b
WHERE (b.campoA IN (SELECT campoA FROM tablaC) OR b.campoA IS NULL)
AND (b.campoB IN (SELECT campoA FROM tablaD) OR b.campoB IS NULL);

Saludos!!
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 02:29.