traverse 12 csv files with UTL_FILE

1

Friends, this is the code I'm doing to go through 12 CSV files, but you're only reading the last file, you can help me

PROCEDURE SP_CARGA_POLY_EXTERNA (V_ERROR OUT VARCHAR2, V_MENSAJE_ERROR OUT VARCHAR2)  
     IS
     V_SECUENCIA NUMBER :=1;
     F UTL_FILE.FILE_TYPE;
     LFILE VARCHAR2(100); --:= 'FILES_IN-'||V_SECUENCIA||'.csv';
     V_ROW VARCHAR2(2000);
     V_T_CARGA_POLY SDBX_GDOC.DE_CARGA_POLY%ROWTYPE;
     I     NUMBER := 0;     
     V_NO_EXISTE_ARCHIVO EXCEPTION;
     BEGIN
       V_ERROR := 1;      
       WHILE V_SECUENCIA<=11
       LOOP                 
       --FOR I IN 1..12 LOOP       
       --UTL_FILE.GET_LINE(F,V_SECUENCIA);           
       LFILE:='FILES_IN-'||V_SECUENCIA||'.csv';
       V_SECUENCIA := V_SECUENCIA + 1;
       END LOOP;        
       F := UTL_FILE.FOPEN(V_NOM_DIR,LFILE,'R');                
       IF UTL_FILE.IS_OPEN(F) THEN
         EXECUTE IMMEDIATE 'TRUNCATE TABLE SDBX_GDOC.DE_CARGA_POLY';        
         LOOP           
           BEGIN
             UTL_FILE.GET_LINE(F,V_ROW);
             IF I > 0 and LENGTH(V_ROW)>20 THEN
               V_T_CARGA_POLY.NO_ARCH_GDOC     := LFILE;
               IF SUBSTR(LFILE,INSTR(LFILE,'IN',1,1),2)='IN' THEN
               V_T_CARGA_POLY.TI_OPER          := 'CUSTODIA';
               ELSE
               V_T_CARGA_POLY.TI_OPER          := 'PRESTADO';
               END IF;                  
               V_T_CARGA_POLY.CA_POLY          := FN_OBTENER_VALOR_COLUMNA(V_ROW,1);
               V_T_CARGA_POLY.DE_OPER          := FN_OBTENER_VALOR_COLUMNA(V_ROW,2);                              
               INSERT INTO SDBX_GDOC.DE_CARGA_POLY VALUES V_T_CARGA_POLY;               
             END IF;
             I := I + 1;                          
             EXCEPTION
               WHEN NO_DATA_FOUND THEN
               EXIT;               
           END;           
         END LOOP;
         COMMIT;         
       END IF;                           
       IF UTL_FILE.IS_OPEN(F) THEN
       UTL_FILE.FCLOSE(F);
       --UTL_FILE.FREMOVE(V_NOM_DIR,LFILE);
       END IF;       
     EXCEPTION
       WHEN V_NO_EXISTE_ARCHIVO THEN
         V_ERROR := '-5000';
         V_MENSAJE_ERROR := 'NO EXISTE ARCHIVO POLY EN LA RUTA';
       WHEN OTHERS THEN
         V_ERROR := SQLCODE;
         V_MENSAJE_ERROR := 'SP_CARGA_POLY_EXTERNA, '||SQLERRM;
    END;    
    
asked by Luis Enrique Hilario Esteban 31.10.2018 в 22:16
source

1 answer

0

The problem is that you have a cycle that builds the names of the files (only 11, not 12), but you do not do anything with the file name within that cycle. Until you have left it (and only the last name is in the variable LFILE you open the file with that name and process it.

You may see it clearer if you improve the indentation of your code and delete old code that you do not use (in comments), for example:

PROCEDURE SP_CARGA_POLY_EXTERNA (V_ERROR OUT VARCHAR2, V_MENSAJE_ERROR OUT VARCHAR2) IS
   V_SECUENCIA NUMBER :=1;
   F UTL_FILE.FILE_TYPE;
   LFILE VARCHAR2(100); --:= 'FILES_IN-'||V_SECUENCIA||'.csv';
   V_ROW VARCHAR2(2000);
   V_T_CARGA_POLY SDBX_GDOC.DE_CARGA_POLY%ROWTYPE;
   I     NUMBER := 0;     
   V_NO_EXISTE_ARCHIVO EXCEPTION;
BEGIN
   V_ERROR := 1;
   /* acá inicia el ciclo que construye 10 nombres de archivo */
   WHILE V_SECUENCIA<=11
   LOOP                 
      LFILE:='FILES_IN-'||V_SECUENCIA||'.csv';
      V_SECUENCIA := V_SECUENCIA + 1;
      /* acá tenemos el nombre del archivo en la variable, pero no hacemos nada con él ya que */
   END LOOP; /* aquí termina el ciclo */
   /* a partir de acá tenemos el nombre del último archivo en la variable, que debiera ser 'FILES_IN-11.csv' */
   /* no he cambiado nada abajo, creo que acá queda claro tu error. */
   F := UTL_FILE.FOPEN(V_NOM_DIR,LFILE,'R');                
   IF UTL_FILE.IS_OPEN(F) THEN
     EXECUTE IMMEDIATE 'TRUNCATE TABLE SDBX_GDOC.DE_CARGA_POLY';        
     LOOP           
       BEGIN
         UTL_FILE.GET_LINE(F,V_ROW);
         IF I > 0 and LENGTH(V_ROW)>20 THEN
           V_T_CARGA_POLY.NO_ARCH_GDOC     := LFILE;
           IF SUBSTR(LFILE,INSTR(LFILE,'IN',1,1),2)='IN' THEN
           V_T_CARGA_POLY.TI_OPER          := 'CUSTODIA';
           ELSE
           V_T_CARGA_POLY.TI_OPER          := 'PRESTADO';
           END IF;                  
           V_T_CARGA_POLY.CA_POLY          := FN_OBTENER_VALOR_COLUMNA(V_ROW,1);
           V_T_CARGA_POLY.DE_OPER          := FN_OBTENER_VALOR_COLUMNA(V_ROW,2);                              
           INSERT INTO SDBX_GDOC.DE_CARGA_POLY VALUES V_T_CARGA_POLY;               
         END IF;
         I := I + 1;                          
         EXCEPTION
           WHEN NO_DATA_FOUND THEN
           EXIT;               
       END;           
     END LOOP;
     COMMIT;         
   END IF;                           
   IF UTL_FILE.IS_OPEN(F) THEN
   UTL_FILE.FCLOSE(F);
   --UTL_FILE.FREMOVE(V_NOM_DIR,LFILE);
   END IF;       
 EXCEPTION
   WHEN V_NO_EXISTE_ARCHIVO THEN
     V_ERROR := '-5000';
     V_MENSAJE_ERROR := 'NO EXISTE ARCHIVO POLY EN LA RUTA';
   WHEN OTHERS THEN
     V_ERROR := SQLCODE;
     V_MENSAJE_ERROR := 'SP_CARGA_POLY_EXTERNA, '||SQLERRM;
END;    

Indentation, unless you use python, is completely ignored by computers. The idea of indenting the code is to help humans (yourself to begin with) to make it easier to understand the code you read (sometimes as you type it).

    
answered by 31.10.2018 в 23:06