Cuando llegue a la empresa donde laboro, uno de los problemas a los que me enfrente fue el buscar soluciones a problemas sencillos que no se hubieran presentado si el diseño de la aplicacion estubiera bien hecho y pensado a futuro, mas siempre la ideologia de los jefes ha sido hacerlo para lo que se necesita de momento.
Un gran problema que se tenia, es que los clientes mandar archivos con mas de mil registros en formato .cvs, estos registros eran leidos con un StreamReader en VB.NET, para con estos datos, poder armar una cadena e insertarla en un IN de SQL.
Ej. SELECT * FROM table WHERE valor IN (n1, n2, n3, n*, n1000);
El problema principal es que el IN de SQL, no puede leer mas de mil registros si uno los esta insertando directamente en la estructura del IN, cosa que no ocurre con un SELECT adentro del IN.
ej. SELECT * FROM table WHERE valor IN (SELECT valor FROM othertable);
¿Cual fue la solución mas sencilla para poder leer el archivo y poder continuar con el uso del mismo query?
Montar el archivo CSV como una tabla temporal de oracle, de este modo podemos hacer un SELECT e insertarlo en el IN sin tener problemas de limites.
Aqui el SQL para crear esa tabla.
CREATE TABLE nombre_tabla (
CAMPOS_A_CREAR VARCHAR2
)
ORGANIZATION EXTERNAL
(TYPE oracle_loader
DEFAULT DIRECTORY temporal
ACCESS PARAMETERS
(
RECORDS DELIMITED BY NEWLINE
BADFILE 'nombre_tabla_bad.log'
DISCARDFILE 'nombre_tabla_dis.log'
LOGFILE 'nombre_tabla.log'
FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"'
(
CAMPOS_A_CREAR VARCHAR2 --Segunda
)
)
LOCATION ('C:\RUTA\AL\ARCHIVO.CSV')
)
REJECT LIMIT UNLIMITED;
La primer ocasion que implemente esto, me encontre con algunos pequeños problemas que fueron resueltos ese mismo dia, y hay algunas configuraciones que realizar antes de poder usar esta solución.
La instruccion DEFAULT DIRECTORY apunta a un alias de oracle, que a su vez apunta al directorio donde van a guardar los archivos para crear las tablas temporales, sin esto, la tabla no funcionara y la realidad es que no probe dandole directamente el path.
Los campos a crear en su segunda aparicion por lo regular deben de ser declarados como CHAR de la longitud que se desee, de lo contrario Oracle mete basura en la tabla. Posiblemente esto sea solo un comportamiento en algunos casos mas no en todos, denle una probada a ver como se comporta con ustedes.
LOCATION se refiere a la ruta donde esta almacenado el archivo, si el archivo no esta en el directorio cuando ustedes creen la tabla, el script se ejecutara sin problemas, el error se mostrara cuando hagan algun select a la tabla.
Asi mismo tambien se puede configurar los delimitadores.
Bueno, creo que es todo y espero que les sirva para algo.
Saludos,
No hay comentarios.