2012-01-26 21:09 @922 |
|
|
keparodo
Perlero Nuevo
|
Registrado: 2011-12-14 17:17 @762 Mensajes: 15
|
|
|
Oracle::SQLLoader
|
|
Hola nuevamente, sigo con mis consultas...
Tenía que transformar distintos tipos de archivos a txt, eliminando caracteres especiales, cosa que hice línea a línea, leyendo el archivo txt, pero el resultado final de ese proceso es lento (1.000 registros por minuto), por lo que he tenido que mejorar.
Lo primero que hice fue leer todo el archivo y quitar ciertos caracteres no deseados.
open $DATOS, '<', $file_name or die "ERROR: No puedo leer el fichero $file_name: $!\n"; local $/; my $archivo_completo = <$DATOS>; close $DATOS; $archivo_completo = quita_acentos($archivo_completo); # sustituye letras acentuadas por la no acentuada $archivo_completo = elimina_caracteres($archivo_completo); # para quitar caracteres no deseados open $ARCHIVO, '>', "$file_name" or die "ERROR: No puedo escribir en el archivo $file_name: $!\n"; print $ARCHIVO $archivo_completo; # ¡Pum! close $ARCHIVO;
Luego de esto, lo que quiero hacer es una carga masiva a una tabla de la BD. Lo que yo voy a insertar en la tabla es toda la línea del archivo txt limpio, más otras dos columnas que son variables.
Mi tabla consta de tres columnas:
id -> identificador del registro, obtenido por una secuencia id_archivo -> que identificará que todas estas líneas pertenecen a este archivo que estoy insertando, lo que debiera pasarle como parámetro trama-> que es todo el contenido de la línea del archivo.txt
Según el ejemplo en cpan.org:
my $flldr = new Oracle::SQLLoader( infile => 'archivo.txt', username => 'usuario', password => 'password', ); $flldr->addTable(table_name => 'tabla');
$flldr->addColumn(column_name => 'id', column_type => $INT);
$flldr->addColumn(column_name => 'id_archivo', column_type => $INT);
$flldr->addColumn(column_name => 'trama', field_offset => 0, field_end => 2000, column_type => $CHAR);
$flldr->executeLoader() || warn "Problem executing sqlldr: $@\n";
¿En qué momento le digo que la columna id debe tomar la secuencia_id.nextval? y ¿en qué momento le digo a id_archivo que es una variable $id_archivo?
Como siempre, muchas gracias.
|
2012-01-26 22:07 @963 |
|
|
 |
explorer
Administrador
|
Registrado: 2005-07-24 18:12 @800 Ubicación: Valladolid, España Mensajes: 10268
|
|
|
Re: Oracle::SQLLoader
|
No conozco nada de Oracle::SQLLoader, pero parece que sirve para volcar un fichero externo a la base de datos. El módulo no tiene ningún sistema para especificar que la secuencia de id debe seguir la norma de nextval, pero... se puede intentar el siguiente truco: Using perl Syntax Highlighting $flldr->addColumn(
column_name => 'id "id_sequence.nextval"',
column_type => $INT,
);
Es decir, incluir las opciones de la columna, en el propio nombre de la columna (según aparece en el SQL*Loader FAQ). Y la segunda pregunta... de $id_archivo... no la entiendo 
_________________ JF^D Perl programming
|
2012-01-27 12:31 @563 |
|
|
keparodo
Perlero Nuevo
|
Registrado: 2011-12-14 17:17 @762 Mensajes: 15
|
|
|
Re: Oracle::SQLLoader
|
|
Como bien dice, el sqlloader hace la inserción de un archivo plano completo a una tabla.
Si esa tabla tiene 3 campos, yo podría usar solo algunas columnas de mi archivo indicándolo con position(1:5). Lo que quiero hacer es llenar mis tres campos de la siguiente manera: El primer campo es una secuencia de Oracle. El segundo es el identificador del archivo que debiera pasar como parámetro al archivo.CTL (no supe cómo pasarle el parámetro) El tercer campo es toda la línea del archivo.txt.
En vez de usar el Oracle::SQLLoader, creé un archivo .CTL para ejecutar desde Unix, que funciona como quiero, pero el segundo campo aún no lo paso por parámetro (aún no sé cómo), lo asigné como un constant "-1", que por el momento me sirve.
La cosa ahora es que desde mi aplicación Perl ejecuto el comando:
my $ret_sys_sqlloader = system("sqlldr squema/clave@ip:port/bd control=carga_archivo.ctl data=archivo_a_leer.txt");
print "\n resultado:".$ret_sys_sqlloader."\n";
El retorno de esta ejecución es 256 y me da el mensaje
SQL*Loader-101: Invalid argument for username/password
Esta misma ejecución la hago desde la línea de comando de Unix y me funciona a la perfección.
¿Alguna sugerencia? Gracias.
|
2012-01-27 17:50 @785 |
|
|
keparodo
Perlero Nuevo
|
Registrado: 2011-12-14 17:17 @762 Mensajes: 15
|
|
|
Re: Oracle::SQLLoader RESUELTO
|
|
Bien, pasó... Ahora me aparecieron otros errores, pero ya salí adelante. Logré ejecutar la misma sentencia a través de la aplicación Perl y los datos llegaron a la tabla.
|
|
Página 1 de 1
|
[ 5 mensajes ] |
|
| Reglas del Foro |
No puedes abrir nuevos temas en este Foro No puedes responder a temas en este Foro No puedes editar tus mensajes en este Foro No puedes borrar tus mensajes en este Foro No puedes enviar adjuntos en este Foro
|
|
Socializa |
 |
|