• Publicidad

Oracle::SQLLoader

Aquí encontrarás todo lo que sea específicamente acerca de módulos de Perl. Ya sea que estás compartiendo tu módulo, un manual o simplemente tienes una duda acerca de alguno.

Oracle::SQLLoader

Notapor keparodo » 2012-01-26 21:09 @922

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.
keparodo
Perlero nuevo
Perlero nuevo
 
Mensajes: 21
Registrado: 2011-12-14 17:17 @762

Publicidad

Re: Oracle::SQLLoader

Notapor explorer » 2012-01-26 22:07 @963

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:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. $flldr->addColumn(
  2.     column_name => 'id  "id_sequence.nextval"',
  3.     column_type => $INT,
  4. );
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4

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 :oops:
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14476
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Oracle::SQLLoader

Notapor keparodo » 2012-01-27 12:31 @563

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.
keparodo
Perlero nuevo
Perlero nuevo
 
Mensajes: 21
Registrado: 2011-12-14 17:17 @762

Re: Oracle::SQLLoader

Notapor explorer » 2012-01-27 12:47 @574

Quizás la '@' dentro del system() esté haciendo de las suyas...

Cambia las comillas dobles por simples, en el system(), y prueba a ver.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14476
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Oracle::SQLLoader

Notapor keparodo » 2012-01-27 17:50 @785

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.
keparodo
Perlero nuevo
Perlero nuevo
 
Mensajes: 21
Registrado: 2011-12-14 17:17 @762


Volver a Módulos

¿Quién está conectado?

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