Oracle - sqlloader

 
Vista:

sqlloader

Publicado por sonia (7 intervenciones) el 30/03/2009 12:43:05
Hola, me gustaria usar el sqlloader para cargar un fichero en tabla. El problema es que el fichero, trae primero una linea de cabecera (tabla1) y seguidamente el detalle (tabla2), con lo que el formato de la primera linea no coicide con la siguientes.
Queria que la primera se cargara en una tabla y las siguientes en otra.
Ej.

H;111;222;333
D;aaa;bbb;ccc;ddd;eee
D;jjjj;dddd;ddd;ddd;ddd

Otra opcion seria, usar solo una tabla, donde los primeros campos fueran la cabecera y los siguientes el detalle, repitiendo asi, la cabecera por cada detalle.

Muchas gracias.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:sqlloader

Publicado por Pedro (38 intervenciones) el 31/03/2009 10:04:30
Hola buenos dias:
Si se puede, pero para ello tiene que tener una condicion restrictiva, es decir, que haya un elemento en la linea que identifique que es cabecera y de lo que son lineas de detalle, muchas veces siguen una numeración o codificación, por lo que podrias hacer lo siguiente

Ejemplo

INTO TABLE TABLA1
WHEN TIPO ='0'
TRAILING NULLCOLS
(
TIPO FILLER POSITION (01:01) CHAR,
...
...
..
)

INTO TABLE TABLA2
WHEN TIPO !='0'
TRAILING NULLCOLS
(
TIPO FILLER POSITION (01:01) CHAR,
...
...
...
)

Espero haberte ayudado
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:sqlloader

Publicado por sonia (7 intervenciones) el 01/04/2009 09:04:24
Muchisimas gracias, otra preguntilla, incluir una clave de relacion, entre la TABLA1 y la TABLA2, entiendo que puedo poner un secuenciador, pero, al poder existir varios bloques, alguna posible solucion?
Ej.

H;111;222;333
D;ZZZ;BBB;CCC;DDD
D;ZZZ;BBB;CCC;DDD
H;444;22;333
D;XXX;BBB;CCC;DDD
D;JJJ;BBB;CCC;DDD
D;JJJ;BBB;CCC;DDD
D;OOO;BBB;CCC;DDD
H;666;22;333
D;XXX;BBB;CCC;DDD

A ver si me explico,
las dos primeras D, estaran unidas por clave con la primera H, y asi sucesivamente, pero no existe ningun campo que las relacione, por lo que habia pensado en crear un id, el tema, es que el id, sera incrementado por cada H, y por cada H existiran varias D

INTO TABLE TABLA1
WHEN TIPO ='0'
TRAILING NULLCOLS
(
ID
TIPO FILLER POSITION (01:01) CHAR,
...
...
..
)

INTO TABLE TABLA2
WHEN TIPO !='0'
TRAILING NULLCOLS
(
ID
TIPO FILLER POSITION (01:01) CHAR,
...
...
...
)
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:sqlloader

Publicado por sonia (7 intervenciones) el 01/04/2009 09:14:27
Ya se me ha ocurrido, a ver si es posible

INTO TABLE TABLA1
WHEN TIPO ='0'
TRAILING NULLCOLS
(
secuenciador.nextval,
TIPO FILLER POSITION (01:01) CHAR,
...
...
..
)

INTO TABLE TABLA2
WHEN TIPO !='0'
TRAILING NULLCOLS
(
secuenciador.currval,
TIPO FILLER POSITION (01:01) CHAR,
...
...
...
)
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:sqlloader

Publicado por Pedro (38 intervenciones) el 01/04/2009 09:39:43
Hola sonia:

Desgraciadamente, no funciona eso que intentas hacer, funciona el nextval, xo el currval no puesto que el sistema de funcionamiento no lo permite, puesto que lee el fichero de una tacada para la primera clausula y luego todo para la segunda, por lo que el currval no sirve para nada.
Habria que ver con la información de los registros si se puede cruzar una tabla con otra
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:sqlloader

Publicado por sonia (7 intervenciones) el 01/04/2009 11:24:11
pufffffffff, que problema, no existe ningun tipo de relacion
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:sqlloader

Publicado por Pedro (38 intervenciones) el 01/04/2009 12:27:00
No tienes nada? ni sikiera un contador de linea?
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:sqlloader

Publicado por sonia (7 intervenciones) el 01/04/2009 17:24:10
No, no existe ni contador.
Se me ocurre lo siguiente,
usar una unica tabla con todos los campos, si el primer caracter es H, rellenar los 5 primeros y dejar a null los 10 siguientes, y si es D, dejar a null los 5 primeros y rellenar los 10 siguientes.
De esta forma quedarian grabados por orden, o no es posible poner la condicion en una unica tabla?
Al procesar la tabla posteriormente, consideraria registro nuevo cada vez que viene relleno el primer campo (cabecera) y detalle los posteriores, hasta la nueva cabecera.
Gracias de antemano
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:sqlloader

Publicado por Pedro (38 intervenciones) el 02/04/2009 09:58:50
joooo, me gustaría darte mejores noticias, pero no es así... pero eso que dices no se puede hacer, como ya te he dicho antes, pondrias una condición y al poner la condición aunque sea la misa tabla, ya obligas a leer varias veces el fichero, entonces como sabes si ese registro pertenece a esa linea.
Yo hice una cosica para un caso similar, pero la estructura era cerrada, o sea que no variaba, yo hacia esto

Cabecera
Registro
Registro
Cabecera
Registro
Registro
Cabecera
..

Entonces le asignaba un contador a cada una de las lineas, entonces para el Registro cabecera le asignaba 1, sabia que le correspondia el 1 y 2 del siguiente, para el registro 2, el 3 y 4 y asi sucesivamente, pero esto solo funciona si el fichero es de estructura cerrada.

Y na, aki stamos si necesitas algo mas.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:sqlloader

Publicado por sonia (7 intervenciones) el 02/04/2009 17:30:25
Gracias, algo se me tendra que ocurrir.
Otra cosita, para dar el nombre al fichero de datos, se pude poner un comodin?
Me explico, el nombre del fichero lleva concatenado el sysdate, podria poner
data=xxxxxx%
cogeria todos los ficheros que existieran xxxxxx

Gracias de nuevo
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:sqlloader

Publicado por Pedro (38 intervenciones) el 06/04/2009 09:07:51
Pues la verdad que no lo he probado nunca,yo lo que si tengo es una funcion plsql, que se le pasa por parametro el nombre del fichero a coger y es el que se carga.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar