jueves, 12 de julio de 2012

Cargar o actualizar datos desde un archivo CSV a un tabla de un Base de datos Oracle utilizando APEX

Hola a tod@s!

Espero se encuentren muy bien. Hoy quiero compartir con ustedes algo que he aprendido y es ¿Cómo cargar o subir datos desde un archivo CSV a un tabla de un Base de datos Oracle utilizando APEX ?



Paso 1: Crear una nueva página con los siguientes objetos

1.1 Un región que sea un reporte iteractivo, sobre la tabla en la que vas a cargar/actualizar los datos (Opcional). Esto se servira para ir llevando un control de lo que vas insertando o actualizando
1.2 Un botón que servirá realizar el submit para cargar los datos
1.3 Un item tipo File Browse, en mi caso tiene el nombre P1_FILE

Paso 2: Crear una validación sobre el item para que se ejecute cada vez que hagas clic sobre el botón cargar. La validación es la de que este item no sea nulo, es decir que siempre se escoja el archivo que se va a cargar antes de hacer clic en el botón.
   En apex la validación es de tipo: Item specified is NOT NULL

Paso 3: Crear un proceso, con las siguientes características:
* Type: PL/SQL anonymous block    Conditional
* Process Point: On Submit - Before Computations and Validations (Esto es para que se ejecute despues de que se realice un submit que en nuestro caso cuando hagamos clic en el botón y si cumple las validaciones que creamos)
* Source: (Esta es la query que sirve solo para insertar registros)

DECLARE
 v_blob_data       BLOB;
 v_blob_len        NUMBER;
 v_position        NUMBER;
 v_raw_chunk       RAW(10000);
 v_char      CHAR(1);
 c_chunk_len   number       := 1;
 v_line        VARCHAR2 (32767)        := NULL;
 v_data_array      wwv_flow_global.vc_arr2;
 v_rows number;
 v_sr_no number := 1;

BEGIN

--Borran datos anteriores
delete from nombre_tabla;

-- Read data from wwv_flow_files
 select blob_content into v_blob_data
 from wwv_flow_files
 where name = :P1_FILE; --AQUI DEBEN CAMBIAR EL NOMBRE POR EL ITEM QUE USTEDES CREEN

v_blob_len := dbms_lob.getlength(v_blob_data);
 v_position := 1;

-- Read and convert binary to char
 WHILE ( v_position <= v_blob_len ) LOOP
 v_raw_chunk := dbms_lob.substr(v_blob_data,c_chunk_len,v_position);
 v_char :=  chr(hex_to_decimal(rawtohex(v_raw_chunk)));
 v_line := v_line || v_char;
 v_position := v_position + c_chunk_len;
 -- When a whole line is retrieved
 IF v_char = CHR(10) THEN
 -- Convert comma to : to use wwv_flow_utilities
 v_line := REPLACE (v_line, ';', ':'); --AQUI POR FAVOR TENGA EN CUENTA CUAL ES EL SEPARADOR QUE UTILIZAN COMA, PUNTO Y COMA.
-- Convert each column separated by : into array of data
 v_data_array := wwv_flow_utilities.string_to_table (v_line);
 -- Insert data into target table
 EXECUTE IMMEDIATE 'INSERT INTO nombre_tabla (campo1
                                      ,campo2
                                      ,campo3
                                      ,campo4
                                      ,campo5
                                      ,campo6
                                      ,campo7
                                      ,campo8
                                      ,campo9
                                      ,campo10
                                      ,campo11
                                      ,campo12
                                      ,campo13)
VALUES (:1,
        :2,
        :3,
        :4,
        :5,
        :6,
        :7,
        :8,
        :9,
        :10,
        :11,
        :12,
        :13)'
 USING
 to_number(v_data_array(1)),
 v_data_array(2),
 v_data_array(3),
 v_data_array(4),
 v_data_array(5),
 v_data_array(6),
 v_data_array(7),
 v_data_array(8),
 v_data_array(9),
 v_data_array(10),
 v_data_array(11),
 to_number(v_data_array(12)),
 v_data_array(13);
 -- Clear out
 v_line := NULL;
 END IF;

END LOOP;
 END;



* Source: (Esta es la query que sirve solo para insertar y actualizar registros)

 
DECLARE
 v_blob_data       BLOB;
 v_blob_len        NUMBER;
 v_position        NUMBER;
 v_raw_chunk       RAW(10000);
 v_char      CHAR(1);
 c_chunk_len   number       := 1;
 v_line        VARCHAR2 (32767)        := NULL;
 v_data_array      wwv_flow_global.vc_arr2;
 v_rows number;
 v_sr_no number := 1;

BEGIN

-- Read data from wwv_flow_files
 select blob_content into v_blob_data
 from wwv_flow_files
 where name = :P1_FILE;

v_blob_len := dbms_lob.getlength(v_blob_data);
 v_position := 1;

-- Read and convert binary to char
 WHILE ( v_position <= v_blob_len ) LOOP
 v_raw_chunk := dbms_lob.substr(v_blob_data,c_chunk_len,v_position);
 v_char :=  chr(hex_to_decimal(rawtohex(v_raw_chunk)));
 v_line := v_line || v_char;
 v_position := v_position + c_chunk_len;
 -- When a whole line is retrieved
 IF v_char = CHR(10) THEN
 -- Convert comma to : to use wwv_flow_utilities
 v_line := REPLACE (v_line, ';', ':');
-- Convert each column separated by : into array of data
 v_data_array := wwv_flow_utilities.string_to_table (v_line);
 -- Insert data into target table
 EXECUTE IMMEDIATE 'MERGE INTO nombre_tabla A USING
 (SELECT
        :1 as "campo1",
        :2 as "campo2",
        :3 as "campo3",
        :4 as "campo4",
        :5 as "campo5",
        :6 as "campo6",
        :7 as "campo7",
        :8 as "campo8",
        :9 as "campo9",
        :10 as "campo10"
  FROM DUAL) B
ON (A.campo1 = B.campo1)
WHEN NOT MATCHED THEN
INSERT (
  campo0, campo1, campo2, campo3, campo4, campo5,
  campo6, campo7, campo8, campo9, campo10)
VALUES (
  secuencia_tabla.nextval, TRIM(B.campo1), TRIM(B.campo2), TRIM(B.campo3), TRIM(B.campo4), TRIM(B.campo5), TRIM(UPPER(B.campo6)),
TRIM(B.campo7), TRIM(B.campo8), TRIM(B.campo9), TRIM(B.campo10))
WHEN MATCHED THEN
UPDATE SET
  A.campo2 = TRIM(B.campo2),
  A.campo3 = TRIM(B.campo3),
  A.campo4 = TRIM(B.campo4),
  A.campo5 = TRIM(B.campo5),
  A.campo6 = TRIM(UPPER(B.campo6)),
  A.campo7 = TRIM(B.campo7),
  A.campo8 = TRIM(B.campo8),
  A.campo9 = TRIM(B.campo9),
  A.campo10 = TRIM(B.campo10)'
 USING
-- to_number(v_data_array(1)),
 v_data_array(1),
 v_data_array(2),
 v_data_array(3),
 v_data_array(4),
 v_data_array(5),
 v_data_array(6),
 v_data_array(7),
 v_data_array(8),
 v_data_array(9),
 v_data_array(10);
 -- Clear out
 v_line := NULL;
 END IF;

END LOOP;

EXCEPTION
 
WHEN OTHERS THEN
    
   apex_application.g_print_success_message := '  Error:  ->> ' || sqlerrm || '  Error2:   ---> ' || DBMS_UTILITY.format_error_backtrace;

 END;


Eso es todo, si quieren personalizar o separar la region de carga de datos del reporte, pueden crear una nueva región, ahi ya es cuestión de como desean personalizar su aplicación.

Les agrego una imagen de como tienen que quedar los pasos:

Cualquier inquietud me comentan, espero poder ayudarles.



El link de donde yo aprendí es: OraExplorer, APEX to upload a text file and write into a table



lunes, 28 de mayo de 2012

Link para crear y validar Expresiones Regulares

Hola a tod@s.

Espero se encuentren muy bien, queria compartir con ustedes una página muy útil, sirve para crear e ir validando expresiones regulares, las cuales nos sirven para validar que la información digitalizada cumpla ciertos parametros. Se las suele utilizar para formatos de fechas, de números, nombres, etc.

Espero les sea de utilidad. El link es: http://regexpal.com/

saludos a tod@s!! Exitos siempre!! y a luchar por alcanzar sus sueños!! :)

Sueños de Informáticos!!

A veces... bueno no... siempre me he preguntado porque elegimos algo, la carrera, tu pareja, tus amig@s, mentir o decir la verdad, bueno siempre elegiges... para que???ahora he comprendido que los sueños son los responsables... elegiges algo porque quieres algo, elegiges no engañar porque no quieres que hagan lo mismo contigo, eliges estar con alguien porque crees y sientes que vas a pasar bien junto a su lado, y bueno, eliges tu carrera para ser alguien... no verdad??? eliges porque tu sueño es el de crear, diseñar construir algo mejor, mas sofisticado... y por eso eres un informático porque analizas todo y sabes lo importante que es escalar paso a paso....

Sistemas 2009

Sistemas 2009
disfrutnado con mis amig@s en la cena de sistemas...