Hacia tiempo que no me ocurria un error como este y no se como solucionarlo, el problema es el siguiente:
Tengo el siguiente codigo el cual he retocado un poco para poder realizar una copia de informacion que se necesita en la empresa (he colocado el modificado ya q el original presenta el mismo problema) a medida que le hacia pruebas estaba mas satisfecho con el funcionamiento hasta que me ocurrio un error con una información, cuando digito esa cotización automaticamente me retorna el error ORA-01403: No se ha encontrado ningun dato. Pero descubri que el error es por un valor en la BD adjunto tabla.
Tabla original vista por el toad almacenada en excel.
Tabla modificada vista por el toad almacenada en excel
El valor que aparece resaltado en la segunda tabla es el que me genera el siguiente error por lo menos en este caso
Adjunto anexo una imagen de los tipos de datos de la tabla con la descripcion.
Aclaro que el procedimiento original esta en funcionamiento y que ese error sucede en algunas ocasiones y la unica solucion que hemos encontrado es quitar todos la informacion de esa columna en esa tabla con respecto al numero de cotizacion.
Les agradezco de antemano la ayuda que me puedan brindar.
Ahora el codigo del procedimiento.
Código:
--CREATE OR REPLACE PROCEDURE Pobrcopadicion(PNUMCOTI VARCHAR2,pcodcap VARCHAR2 DEFAULT NULL,PNUMOBR2 VARCHAR2,ptipo VARCHAR2) IS declare CURSOR cAntCapitulos IS select codigo,DESCRIPCION,CODCOTI,CODPADRE,COMENTARIOS,FECINICIAL,DURACION,FECREQUERIDA,TBUNMED_ID,CODEXT,CANTIDAD,VALOR from( SELECT UNIQUE * FROM TDCAPCOTI WHERE codcoti = :pnumcoti CONNECT BY PRIOR codigo = codpadre AND PRIOR codcoti = :pnumcoti START WITH codigo =NVL(TO_NUMBER(:pcodcap),codigo) --codigo --pcodcap AND codcoti = :pnumcoti) group by codigo,DESCRIPCION,CODCOTI,CODPADRE,COMENTARIOS,FECINICIAL,DURACION,FECREQUERIDA,TBUNMED_ID,CODEXT,CANTIDAD,VALOR; --- TYPE tCodigos IS TABLE OF NUMBER(10) INDEX BY BINARY_INTEGER; vCodPadres tCodigos; CURSOR cNuevObra IS SELECT 'x' FROM TBOBRATEC WHERE codigo = :pnumobr2; vDummy VARCHAR2(1); vCodigo NUMBER(10) := NULL; BEGIN /************************ Verifico que exista la Obra en la que se va a insertar el nuevo capitulo. ************************/ OPEN cNuevObra; FETCH cNuevObra INTO vDummy; IF cNuevObra%NOTFOUND THEN RAISE_APPLICATION_ERROR(-20010,'No existe la Obra en la que se desea copiar el capitulo.'); -- PForMsgBox('No existe la Obra en la que se desea copiar el capitulo.','ERROK'); END IF; CLOSE cNuevObra; /************************ Hallo el siguiente consecutivo de la serie. ************************/ SELECT NVL(MAX(codigo),0)+1 INTO vCodigo FROM TDCAPOBRAS WHERE tbobratec_cod = :pnumobr2; /************************ Inserto los capitulos. ************************/ FOR fila IN cAntCapitulos LOOP vCodPadres(fila.codigo) := vCodigo; DECLARE vCodauxPadre NUMBER(10); BEGIN IF fila.codPadre IS NULL THEN vcodAuxPadre := NULL; ELSE vCodAuxPadre := vCodPadres(fila.codpadre); -- dbms_output.put_line(' El valor de vCodPadres('||fila.codpadre||') es de: '||vCodPadres(fila.codpadre)); END IF; -- dbms_output.put_line('El valor de vCodPadres('||fila.codigo||') es de: '||vCodPadres(fila.codigo)||' El valor de vCodauxPadre antes de asignar es de: '||vCodauxPadre||' El valor de vCodPadres('||fila.codpadre||') es de: '||vCodPadres(fila.codpadre)); dbms_output.put_line('los valores para el capitulo es, vCodigo: '||vCodigo||', descripcion: '||fila.descripcion||', Obra: '||:pnumobr2||', vCodAuxPadre: '||vCodAuxPadre||', comentarios:'||fila.comentarios||','||fila.fecinicial||','||fila.duracion||','||fila.fecrequerida||','||''||','||''||', Tipo: '||:ptipo||', tbunmed_id: '||fila.tbunmed_id||', codext: '||fila.codext||','||fila.cantidad||','||fila.valor); /*INSERT INTO TDCAPOBRAS(codigo,descripcion,tbobratec_cod,codpadre,comentarios,fecinicial,duracion,fecrequerida,fecinireal,fecfinreal,tipo,tbunmed_id,codext,cantidad,valor) VALUES (vCodigo,fila.descripcion,:pnumobr2,vCodAuxPadre,fila.comentarios,fila.fecinicial,fila.duracion,fila.fecrequerida,NULL,NULL,:ptipo,fila.tbunmed_id,fila.codext,fila.cantidad,fila.valor); */END; /************************ Inserto los componentes de los capitulos ************************/ --dbms_output.put_line('los valores para el detalle del capitulo son; '||vCodigo||','||fila.descripcion||','||:pnumobr2||','||vCodAuxPadre||','||fila.comentarios||','||fila.fecinicial||','||fila.duracion||','||fila.fecrequerida||','||''||','||''||','||:ptipo||','||fila.tbunmed_id||','||fila.codext||','||fila.cantidad||','||fila.valor); /*INSERT INTO TDDCAPOBRA(tdsumis_codpro, tdsumis_conster, numlinea, tdcapobra_cod, tbobratec_cod, porcriesgo, total, precio, tbundmed_id, tbtemp_cod, undconv_id, tdters_nit, tdters_tid, cantidad, fecha_reser, tbmanobra_codigo) SELECT tdsumis_codpro, tdsumis_conster, numlinea, vCodigo, :PNUMOBR2, porcriesgo, total, precio, tbundmed_id, tbptemp_cod, undconv_id, tdters_nit, tdters_tid, cantidad, NULL, tbmanobra_codigo FROM TDDCAPCOTI WHERE tdcapcoti_codcoti = fila.codcoti AND tdcapcoti_cod=fila.codigo; */ vCodigo := vCodigo +1; END LOOP; COMMIT; EXCEPTION WHEN OTHERS THEN IF cNuevObra%isopen THEN CLOSE cNuevObra; END IF; raise_application_error(-20000,'Error AL COPIAR CAPITULOS: ' || sqlerrm); -- RAISE; END;-- Pobrcopadicion;