"To_number() " genera error en 11g (unix)

La situación es que tengo un SP que funcionaba correctamente hasta que migramos de Oracle 10g en Windows a 11g en HP-UX, el error se presenta en la siguiente línea:

v_Nprod := To_Number(v_Cprod, '999g999g999d99', 'nls_numeric_characters=''.,''');

-- V_Cprod es varchar2(10), contiene una cadena para ser convertida en número.

-- V_Nprod es number(9, 2)

El error es: ORA-06502 "Error numérico o de valor"

Pero si ejecuto un select con la misma instrucción, me devuelve resultados sin problema alguno:

SELECT To_Number('125.05', '999g999g999d99', 'nls_numeric_characters=''.,''') FROM DUAL;

1

1 respuesta

Respuesta
1

¿Podrías verificar que valor tiene la variable v_Cprod en el momento que se produce el error? Por favor comparte el valor de la variable para reproducir el problema:

BEGIN
n := to_number(v_cprod, '999g999g999d99','nls_numeric_characters=''.,''');
EXCEPTION WHEN OTHERS THEN
raise_application_error(-20001, '<<<( ' || v_cprod || ' )>>> ' || SQLERRM);
END;

Saludos y gracias por interesarte en ayudarme.

DECLARE
e_Cnomarch Varchar2(100);
v_Ccadena Varchar2(100);
v_Ccodtar Varchar2(3);
v_Cprod Varchar2(10);
v_Csep Varchar2(1);
v_Cuso Varchar2(3);
v_Cpos Number(3);
v_Nprod Number(9, 2);
v_Ncoma Number(3);
v_Npunto Number(3);
Archivo Utl_File.File_Type;
Begin
e_Cnomarch := 'emas delimitado.csv';
Archivo := Utl_File.Fopen('ARCH_ACTIVOS', e_Cnomarch, 'R');
Loop
Begin
Utl_File.Get_Line(Archivo, v_Ccadena);
Exception
When No_Data_Found Then
Exit;
End;
-- identificar separador
v_Cpos := Instr(v_Ccadena, ',');
If (v_Cpos = 0 Or v_Cpos > 4) Then
-- si no hay o está en otra posición por cualquier razón se busca el punto y coma
v_Cpos := Instr(v_Ccadena, ';');
If (v_Cpos = 0 Or v_Cpos > 4) Then
Raise_Application_Error(-20001, 'No se encuentra el separador de las columnas, debe ser coma o punto y coma');
Else
v_Csep := ';';
End If;
Else
v_Csep := ',';
End If;
v_Cpos := Instr(v_Ccadena, v_Csep);
v_Cuso := Trim(Substr(v_Ccadena, 1, v_Cpos - 1));
v_Ccadena := Substr(v_Ccadena, v_Cpos + 1);
v_Cpos := Instr(v_Ccadena, v_Csep);
v_Ccodtar := Trim(Substr(v_Ccadena, 1, v_Cpos - 1));
v_Ccadena := Substr(v_Ccadena, v_Cpos + 1);
v_Cprod := Trim(Replace(v_Ccadena, '"'));
-- conversión a número de los kilos, el proceso trata de detectar los caracteres númericos
v_Ncoma := Instr(v_Cprod, ',');
v_Npunto := Instr(v_Cprod, '.');
If (v_Ncoma > v_Npunto) Then
-- el separador es coma
v_Nprod := To_Number(v_Cprod, '999g999g999d99', 'nls_numeric_characters='',.''');
Else
v_Nprod := To_Number(v_Cprod, '999g999g999d99', 'nls_numeric_characters=''.,''');
End If;
End Loop;
Utl_File.Fclose(Archivo);
Commit;
EXCEPTION WHEN OTHERS THEN
raise_application_error(-20001, '<<<( ' || v_cprod || ' )>>> ' || SQLERRM);
End;

Había omitido algo importante, y es que el valor está siendo originalmente cargado desde un archivo plano, le hecho cantidad de pruebas para identificar si está cargando la cadena correctamente y parece que efectivamente está quedando almacenado '125.05' dentro de "v_Cpos".

Gracias nuevamente,

Ejecuta ese Procedimiento y comparte el mensaje de error.

Por favor agrega esto al RAISE:

raise_application_error(-20001, '<<<( ' || v_cprod || ' )>>> <<<('||length(v_cprod)||') >>> '|| SQLERRM)

Saludos,

PD. No se si ya resolviste el problema. No había podido ver tu respuesta :(

Saludos Experto,

Te cuento que ya he solucionado esta situación, almacene en una tabla el valor de la variable antes de hacerle el To_Number, de manera que luego de presentarse el error pudiese tomar este valor y revisarlo; así fue como note que al final del número estaba quedando algo que parecía ser un espacio, pero que no se eliminaba con un trim() ni con un replace(), supongo que finalmente era un salto de línea que no podía ser interpretado por

el motor (algo debe tener que ver el hecho de que está montado en HP-UX); así fue como

preferí adicionar algo que me manejara la excepción del "error numérico o de valor", y le

hiciera un substr() hasta el penúltimo caracter:

Begin

v_Nprod := To_Number(v_Cprod, '999g999g999d99',
'nls_numeric_characters='',.''');
Exception
When Value_Error Then
v_Cprod := Substr(v_Cprod, 1, Length(v_Cprod) - 1);
v_Nprod := To_Number(v_Cprod, '999g999g999d99',
'nls_numeric_characters='',.''');
End;

Mil gracias por tu ayuda,

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas