Oracle - Cargar un archivo csv a una tabla de oracle

 
Vista:

Cargar un archivo csv a una tabla de oracle

Publicado por Yamir Martinez (2 intervenciones) el 20/01/2016 23:18:41
Buenas Tardes.

Quisiera que me ayudaran en este caso el dia de hoy estoy pasando penurias con esta panatalla la cual quiero que cargue un archivo csv a mi tabla de Oracle. la cual no quiere cargar no se porque aquí les mando mi procedimiento que he creado a ver si logran ayudarme. Se los agradecería enorme mente. Mi correo es el [email protected];

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
PROCEDURE LEE_ARCHIVO_RELOJ IS
	in_file Text_IO.File_Type;
	vinformacion Varchar2(1000);
	filename varchar2(256);
	fpath varchar2(99);
	fname varchar2(50);
	sep char(1);
	EXISTE BOOLEAN NOT NULL := TRUE;
 
 
BEGIN
 
	MESSAGE ('LEER INICIO'); PAUSE;
 
	fpath := 'C:\RH\MARCACIONES';--'T:\RH\MARCACIONES';
--	fname  := ''||:E.DESCRIPCION||'.CSV';
	fname :='REPUESTOS.CSV';
	sep := ',';
  filename := fpath||fname;
 
 
MESSAGE ('LEER DOS'); PAUSE;
	synchronize;
  in_file := Text_IO.Fopen(filename, 'r');
  IF Text_IO.Is_Open(in_file)THEN
  synchronize;
 
  MESSAGE('LECTURA DEL ARCHIVO'||FNAME);
  WHILE EXISTE LOOP
  	MESSAGE ('PASO INICIO'); PAUSE;
  BEGIN
 
      TEXT_IO.GET_LINE(in_file,vinformacion);
      TEXT_IO.PUT(vinformacion);
      IF vinformacion IS NOT NULL THEN
         insert into rh_data values (vinformacion);
      END IF;
      EXCEPTION WHEN NO_DATA_FOUND THEN
         TEXT_IO.FCLOSE (in_file);
         EXISTE := FALSE;
         message('ARCHIVO LEIDO SATISFACTORIAMENTE');
 
    MESSAGE ('LEER EARCHIVO'); PAUSE;
    END;
  END LOOP;
 
  :SYSTEM.MESSAGE_LEVEL := 10;
  COMMIT;
  :SYSTEM.MESSAGE_LEVEL := 0;
  END IF;
END;
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

Cargar un archivo csv a una tabla de oracle

Publicado por Luis (235 intervenciones) el 21/01/2016 20:13:30
Hola, estas usando oracle forms?
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

Cargar un archivo csv a una tabla de oracle

Publicado por Yamir Martinez (2 intervenciones) el 21/01/2016 21:30:48
Si estoy utilizando Forms Builder para la realizacion de esta forma pero no se porque con el procedimiento que te mencione no me funciona. Si me pudiera ayudar seria de gran Ayuda.

Saludos y gracias.
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
Imágen de perfil de Daniel Rodas

Cargar un archivo csv a una tabla de oracle

Publicado por Daniel Rodas (9 intervenciones) el 15/02/2016 23:04:19
Hola

Te sugiero que crees un stored procedure con un script similar a este que adjunto, el cual lo tengo funcionando en producción sin problemas, solo es que le sustituyas tus datos

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
CREATE OR REPLACE PROCEDURE TU_PROCEDURE (
   as_file          IN VARCHAR)
IS
   dml_errors          EXCEPTION;
   lv_campo            VARCHAR (1000);
   lv_error            VARCHAR (5000);
   sseparator          VARCHAR (1) := '|';
   lposend             NUMERIC (5) := 0;
   lposstart           NUMERIC (15) := 1;
   lseparatorlen       NUMERIC (5) := 0;
   lcounter            NUMERIC (5) := 1;
   li_posz             NUMERIC (5) := 0;
   i                   NUMERIC (5) := 0;
   ll_linea            NUMERIC (10) := 0;
   li_pais             VARCHAR2 (2 BYTE);
   ls_czpn             VARCHAR2 (15 BYTE);
   li_inv_trend        VARCHAR2 (11 BYTE);
   li_inv_minipic      VARCHAR2 (11 BYTE);
   li_inv_confirmado   VARCHAR2 (11 BYTE);
   li_inv_bodega       VARCHAR2 (11 BYTE);
   ls_descripcion      VARCHAR2 (30 BYTE);
   li_negocio          NUMBER(2);
   crlf                VARCHAR2 (2) := CHR (13) || CHR (10);
 
BEGIN
   -- Limpio tabla
    --EXECUTE IMMEDIATE 'Truncate Table ADMINISTRATOR.INVENMACPAC';
 
   DECLARE
      vinhandle   UTL_FILE.file_type;
      lv_linea    VARCHAR2 (15000);
   BEGIN
      vinhandle := UTL_FILE.fopen ('ORALOAD', as_file, 'r');
 
	  /*
Donde MPLOAD es un alias que hace referencia a un directorio en el servidor de base de datos.
Eso lo vez con este query:
1
select * from dba_directories

1
2
3
4
5
6
7
8
9
10
11
12
OWNER                          DIRECTORY_NAME                 DIRECTORY_PATH
------------------------------ ------------------------------ --------------------------------------
SYS                            DATA_PUMP_DIR                  /datos/dpump/
SYS                            DATA_PUMP_LOG                  /datos/dpump/
SYS                            EMAIL                          /datos/email
SYS                            EMAIL_DIR                      /datos/email/
SYS                            ORALOAD                        /datos/email/
SYS                            EMAIL_DIR2                     /datos/email2
SYS                            EMAIL2                         /datos/email2
SYS                            EMAIL_DIR3                     /datos/email3
SYS                            MY_DOCS                        /u01/app/oracle/
SYS                            TOAD_TRACEFILE_DIR             /u01/app/oracle/admin/STDBY/udump

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
 */
      DBMS_OUTPUT.put_line ('PROCESO INICIADO');
 
      LOOP
         BEGIN
            UTL_FILE.get_line (vinhandle, lv_linea);
 
            lv_linea      := TRIM (lv_linea);
            lseparatorlen := LENGTH (sseparator);
            lposend       := INSTR (lv_linea, sseparator, 1);
 
            WHILE lposend > 0 LOOP
               i        := i + 1;
               lv_campo := TRIM (SUBSTR (lv_linea, lposstart,lposend - lposstart));
 
               CASE i
                  WHEN 1 THEN -- Campo 1
                     li_pais     := lv_campo;
                  WHEN 2 THEN -- Campo 2
                     ls_czpn     := lv_campo;
                  WHEN 3 THEN -- Campo 3
                     li_inv_trend := lv_campo;
                  WHEN 4 THEN -- Campo 4
                     li_inv_minipic := lv_campo;
                  WHEN 5 THEN -- Campo 5
                     li_inv_confirmado := lv_campo;
                  WHEN 6 THEN -- Campo 6
                     li_inv_bodega := lv_campo;
                  WHEN 7 THEN -- Campo 7
                    ls_descripcion := lv_campo;
                  ELSE
                     lv_campo    := NULL;
               END CASE;
 
               lv_campo  := NULL;
               lposstart := lposend + lseparatorlen;
               lposend   := INSTR (lv_linea, sseparator, lposstart);
               lcounter  := lcounter + 1;
            END LOOP;
 
            lposend       := 0;
            lposstart     := 1;
            lseparatorlen := 0;
            lcounter      := 1;
            li_posz       := 0;
            i             := 0;
            ll_linea      := ll_linea + 1;
 
            BEGIN
 
               lv_error    := lv_linea;
 
				-- Inicio rutinas de insert
					.
					.
					.
               -- Fin rutinas de insert
 
            EXCEPTION
               WHEN dml_errors THEN
                  raise_application_error (-20000,' Linea)----->>>'
                     || TO_CHAR (ll_linea)
                     || crlf
                     || ' (Error de valores de Carga 1)----->>>'|| lv_error
                     || ' Linea)----->>>'|| TO_CHAR (ll_linea));
 
               WHEN OTHERS THEN
                  raise_application_error (-20000,' Linea)----->>>'
                     || TO_CHAR (ll_linea)
                     || crlf
                     || ' (Error de valores de Carga 2)----->>>'|| lv_error
                     || ' Linea)----->>>'|| TO_CHAR (ll_linea)
                     || crlf);
            END;
 
         EXCEPTION
            WHEN NO_DATA_FOUND THEN
               EXIT;
            WHEN OTHERS THEN
               raise_application_error (-20000,sqlerrm||' Linea )----->>>'
                  || TO_CHAR (ll_linea)
                  || crlf
                  || ' (Error de valores de Carga 1)----->>>'|| lv_error
                  || ' Linea)----->>>'|| TO_CHAR (ll_linea));
               EXIT;
         END;
      END LOOP;
 
      UTL_FILE.fclose (vinhandle);
   END fopen;
 
   DBMS_OUTPUT.put_line ('PROCESO FINALIZADO');
END;
/
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

Cargar un archivo csv a una tabla de oracle

Publicado por Alixandro Florian (5 intervenciones) el 10/05/2023 18:54:23
Saludos,

Revisa estas linea del cogigo.
fpath := 'C:\RH\MARCACIONES';--'T:\RH\MARCACIONES';
-- fname := ''||:E.DESCRIPCION||'.CSV';
fname :='REPUESTOS.CSV';
sep := ',';
filename := fpath||fname;

Modificada:

fpath := 'C:\RH\MARCACIONES\';--'T:\RH\MARCACIONES';
-- fname := ''||:E.DESCRIPCION||'.CSV';
fname :='REPUESTOS.CSV';
sep := ',';
filename := fpath||fname;

Nota: Debe asegurar que el usuario tenga los privilegios en la ruta indicada.

Observación: el procedimiento que le ha compartido Daniel es funcional, la particularidad de este es que usa UTL_FILE y este no escribe en disco de la Pc local (que invoca el proceso, sino, en disco del servidor donde reside la base de datos, por los que de leer las instrucciones de uso. UTL_FILE es más eficiente para operaciones I/O.

Aunque tarde, pero espero que le sirva a alguien en situación similar.
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