Problema con stored Procedure de Oracle

digitaldna

Lanero Novato
8 Jul 2010
1
Buenas a todos.

Bueno este es mi segundo post y tan rápido con una duda que tengo sobre un stored procedure de Oracle 11g

Estamos haciendo un proyecto que conjunta una herramienta que se llama Webdev y
Oracle para las bases de datos pero en este proyecto hay que cargar un archivo de texto plano (txt) para procesar su contenido,

El proceso es Como sigue:

1. Selecciono el archivo y lo proceso enviando todo el contenido a una tabla temporal.
2. Proceso el contenido con un stored Procedure que lo envía a 6 tablas fijas que son las "inconsistencias" (dependiendo de los criterios de cada línea del archivo).
3. Ejecuto un Tercer Stored Proceudre para quitar de la tabla de "inconsistencias" los registros válidos y Pasarlos a las tablas que les corresponden (que es 1 tabla padre, con 7 tablas hijo).

He estado haciendo varios stored procedures y todos funcionan bien hasta que me topé con el que describo a continuación en el cual ejecuto la instrucción Insert all (que es el del paso 3).

Código:
create or replace procedure sp_procesar_inconsist
is
begin
  insert all
  into sas_h_telnor (sas_h_telnorid,cve_registro,fecha_fact,importe,lada_telefono,sas_c_Ctas_telefoniaid,status)
  values (inc_id_h_telnor.NextVal, cve_registro,fecha_fact,importe,lada_telefono,ctas_telefonia,'N')
  into sas_h_telnor_ld
  values (inc_id_h_telnor_ld.NextVal,cve_pob_destino,duracion_cobro,fecha_llamada,hora_ini,mca_larga_duracion,n_800, n_telcard,pob_destino,tel_destino,cves_nal_intnl,cve_x_cobrar,cves_varias,plan_tarifario,tipo_llamada,inc_id_h_telnor.CurrVal)
  select * from v_procesa_ld WHERE INSERTABLE='1';
 
  delete sas_h_telnor_inc_ld where telnor_inc_id IN(select telnor_inc_id from v_procesa_ld WHERE INSERTABLE='1');
  commit;
 
  insert all
  into sas_h_telnor (sas_h_telnorid,cve_facturacion,cve_registro,fecha_fact,importe,lada_telefono,sas_c_ctas_telefoniaid,status)
  values(inc_id_h_telnor.NextVal,cve_facturacion,cve_registro,fecha_fact,importe,lada_telefono,ctas_telefonia,'N')
  into sas_h_telnor_servicio_medido
  values(inc_id_serv_medido.NextVal,cant_llamadas,fecha_desde,fecha_hasta,inc_id_h_telnor.CurrVal)
  select * from v_procesa_serv_med WHERE INSERTABLE='1';
 
  delete sas_h_telnor_inc_serv_med where id_inc_serv_med in(select id_inc_serv_med from v_procesa_serv_med WHERE INSERTABLE='1');
 
  commit;
 
  insert all
  into sas_h_telnor (sas_h_telnorid,cve_facturacion,cve_registro,fecha_fact,importe,sas_c_ctas_telefoniaid,status)
  values(inc_id_h_telnor.NextVal,cve_facturacion,cve_registro,fecha_fact,importe,ctas_telefonia,'N')
  into sas_h_telnor_ladaenlaces
  values(inc_id_ladaenlaces.NextVal, acta_recepcion, cantidad_ladaenlaces,fecha_puesta_serv,kilometros,pob_a,pob_b,punta_a,punta_b,tipo_circuito,inc_id_h_telnor.CurrVal)
  select * from v_procesa_ladaenlaces WHERE INSERTABLE='1';
 
  delete sas_h_telnor_inc_ladaenlaces where id_inc_ladaenlaces in(select id_inc_ladaenlaces from v_procesa_ladaenlaces WHERE INSERTABLE='1');
 
  commit;
 
  insert all
  into sas_h_telnor (sas_h_telnorid,cve_registro,fecha_fact,importe,sas_c_ctas_telefoniaid,status)
  values (inc_id_h_telnor.NextVal, cve_registro,fecha_fact,importe,ctas_telefonia,'N')
  into sas_h_telnor_gtos
  values(inc_id_gastos.NextVal,contador_facturacion,enganche,monto_financiado,plazo,secuencia,cod_serv_equipo,inc_id_h_telnor.CurrVal)
  into sas_h_telnor_detalle_gtos_rtas
  values(inc_id_detalle.NextVal,descripcion,porc_iva,cve_nom_detalle,edo_reg,inc_id_h_telnor.CurrVal)
  select * from v_procesa_gastos WHERE INSERTABLE='1';
 
  delete sas_h_telnor_inc_gtos where id_inc_gtos in (select id_inc_gtos from v_procesa_gastos WHERE INSERTABLE='1');
 
  commit;
 
  insert all
  into sas_h_telnor (sas_h_telnorid,cve_registro,fecha_fact,importe,lada_telefono,sas_c_ctas_telefoniaid,status)
  values (inc_id_h_telnor.NextVal, cve_registro,fecha_fact,importe,lada_telefono,ctas_telefonia,'N')
  into sas_h_telnor_rtas_nombres
  values(inc_id_rtas_nom.NextVal,calle,cta_fact,nombre,inc_id_h_telnor.CurrVal)
  into sas_h_telnor_detalle_gtos_rtas (id_detalle,porc_iva,id_nom_Detalle,id_edo_reg,sas_h_telnorid)
  values(inc_id_detalle.NextVal,porc_iva,cve_nom_detalle,edo_reg,inc_id_h_telnor.CurrVal)
  select * from v_procesa_rtas_nom WHERE INSERTABLE='1';
 
  delete sas_h_telnor_inc_rtas_nom where id_inc_rtas_nom in(select id_inc_rtas_nom from v_procesa_rtas_nom WHERE INSERTABLE='1');
 
  commit;
 
  insert all
  into sas_h_telnor (sas_h_telnorid,cve_registro,fecha_fact,importe,lada_telefono,sas_c_ctas_telefoniaid,status)
  values (  inc_id_h_telnor.NextVal,cve_registro,fecha_fact,importe,lada_telefono,ctas_telefonia,'N')
  into sas_h_telnor_rtas_detalle
  values(inc_id_detalle_telnor.NextVal, cantidad_servicios, conexion, fecha_cargo,ld_telefono_8,min_interconexion,troncal,inc_id_h_telnor.CurrVal)
  into sas_h_telnor_detalle_gtos_rtas (id_detalle,id_nom_Detalle,sas_h_telnorid)
  values(inc_id_detalle.NextVal,cve_nom_detalle,inc_id_h_telnor.CurrVal)
  select * from v_procesa_rtas_detalle WHERE INSERTABLE='1';
 
  delete sas_h_telnor_inc_rtas_detalle where id_inc_rtas_detalle in (select id_inc_rtas_detalle from v_procesa_rtas_detalle WHERE INSERTABLE='1');
  commit;
 
end sp_procesar_inconsist;

Compilo el Stored procedure y no me marca ningún error, el problema es que cuando lo ejecuto me manda el siguiente error:

Error starting at line 1 in command:
execute sp_procesar_inconsist;
Error report:
ORA-02291: restricción de integridad (SASBC.SYS_C0010852) violada - clave principal no encontrada
ORA-06512: en "SASBC.SP_PROCESAR_INCONSIST", línea 4
ORA-06512: en línea 1
02291. 00000 - "integrity constraint (%s.%s) violated - parent key not found"
*Cause: A foreign key value has no matching primary key value.
*Action: Delete the foreign key or add a matching primary key.

La clave principal a la que hace referencia es una llave foránea de la tabla hijo a la tabla padre y esto me sucede en todas las instrucciones insert all del SP. Coloqué la secuencia de la tabla padre (siempre es la primera instruccion después del comando insert all) con NextVal y en la tabla hijo coloqué CurrVal donde va dicha llave foránea. Intenté deshabilitando solo la llave a la que hace referencia el error y me insertó el doble de registros que debe insertar (eg. Tengo 57405 registros en la vista, si le deshabilito la llave o deshabilito todas las llaves, me inserta el doble: 114810 registros en cada tabla). Estuve probando cada Query por separado y me sucede lo mismo pero noté que cuando son pocos registros si los procesa bien, cuando son muchos como que se hace bolas y me manda el error descrito anteriormente. Alguien que me pueda dar una idea para solucionar dicho problema o alguna otra sugerencia para ejecutar lo que quiero hacer en este SP?

Muchas gracias por su atención y el tiempo empleado para resolver mi duda.

Saludos a todos.
 

Los últimos temas