• Publicidad

error ORA-01722 al querer insertar un dato numérico

¿Apenas comienzas con Perl? En este foro podrás encontrar y hacer preguntas básicas de Perl con respuestas aptas a tu nivel.

error ORA-01722 al querer insertar un dato numérico

Notapor dandarc_perl » 2009-05-12 18:12 @800

Hola,

Tal vez esto no tiene que ver totalmente con el lenguaje Perl, pero yo creo que sí; este problema solo lo tengo en Perl, jeje.

Bueno, les explico, tengo un programa en Perl que carga un archivo plano en una tabla que se podría calificar como de "paso" y una vez cargada dicha tabla se realiza un "insert into" en otra tabla.

El problema es que me está marcando un error de número inválido, pero todos los datos que quiero pasar son numéricos.

Aquí les pongo el código que utilizo:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
#! /usr/local/bin/perl
use warnings;
use strict;
use DBI;

##hace la carga de datos en la tabla de paso, esto lo hace sin problemas
system("sqlldr usuario/pass\@BD CONTROL=archivo_control.ctl LOG=log.log direct=true");

##hace la carga desde la tabla de paso a la tabla permanente.
##aqui es donde esta el problema
my $QUERY = "insert into tabla_productiva \n".
                        "(campo_varchar,campo_number) \n".
                        "select \n".
                        " campo_varchar,to_number(campo_number) \n".
                        "from tabla_de_paso";

my $dbh = DBI->connect("dbi:Oracle:BD", "user", "pass", {AutoCommit => 1 });
my $statement= $QUERY;
my $sth = $dbh->prepare($statement) or die("Couldn't prepare statement: " . $dbh->errstr);
my $rv = $sth->execute or die("Couldn't execute statement: " . $sth->errstr);
$sth->finish;

$dbh->disconnect;
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4


y me manda la siguiente salida:
Código: Seleccionar todo
SQL*Loader: Release 10.2.0.4.0 - Production on Mar May 12 17:57:14 2009

Copyright (c) 1982, 2007, Oracle.  All rights reserved.


Load completed - logical record count 7.
DBD::Oracle::st execute failed: ORA-01722: invalid number (DBD ERROR: error possibly near <*> indicator at char 185 in 'insert into tabla_productiva
(campo_varchar,campo_number)
select
 campo_varchar,<*>to_number(campo_number)
from tabla_de_paso') [for Statement "insert into tabla_productiva
(campo_varchar,campo_number)
select
 campo_varchar,to_number(campo_number)
from tabla_de_paso"] at carga_datos.pl line 143.


Cabe mencionar que si ejecuto ese mismo query directo en mi base de datos no me manda error alguno y también si lo ejecuto con un programa en Java me lo realiza sin problemas.

Espero haberme explicado bien, y sobretodo que alguien me pueda ayudar. :roll:

Gracias y saludos.
dandarc_perl
Perlero nuevo
Perlero nuevo
 
Mensajes: 28
Registrado: 2008-08-13 17:55 @788

Publicidad

Notapor explorer » 2009-05-12 18:53 @828

No conozco Oracle, pero el aviso da la sensación de que quiere decir que el campo campo_number contiene algo que no es un número, por lo que no ha podido realizar la conversión to_number().

Sería interesante ver el aspecto de tabla_de_paso, hacia la línea 7.

Actualización: Sí, buscando en la documentación de Oracle por Internet, el error 01722 indica un fallo de conversión de cadena de caracteres a número. Lo que no sé es si, por ejemplo, ese registro tiene un carácter de nueva línea, al final, y eso, quizás, provoque el fallo. O que no haya nada en ese campo en el registro número 7, o que en lugar del punto decimal el separador sea la coma (con lo que el significado de esos caracteres cambia).
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Solucion

Notapor dandarc_perl » 2009-05-13 10:44 @489

Gracias explorer,
he encontrado el problema y es muy gracioso, o por lo menos para mi lo es porque me he roto la cabeza siendo que la solucion es muy sencilla.

Bueno lo que esta pasando es que mis datos numericos que quiero pasar a la tabla_productiva tienen punto para delimitar los decimales e ironicamente no acepta el punto, si no que hay que ponerle una coma para delimitar los decimales en la tabla_de_paso.

Ahora solo necesito crear una expresion regular que me cambie el punto por la coma, si me pudieran ayudar en eso se los agradeceria.

Y espero que este tema le sirva a alguien mas para que no se tarde tanto en descubrir la situacion jejejeje. :oops:
dandarc_perl
Perlero nuevo
Perlero nuevo
 
Mensajes: 28
Registrado: 2008-08-13 17:55 @788

Notapor dandarc_perl » 2009-05-13 11:03 @502

Jajajaja, tambien la expresion regular es muy sencilla, la encontre en los tutoriales.
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
my $string = "32.5";

$string =~ tr/./,/;

print $string."\n";
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Bueno, espero que a alguien le sirva esto, saludos.
dandarc_perl
Perlero nuevo
Perlero nuevo
 
Mensajes: 28
Registrado: 2008-08-13 17:55 @788


Volver a Básico

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 28 invitados

cron