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
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
Comentarios
online dating novels [url=http://loveepicentre.com/]teen age dating tips[/url] dating for agnostics
scientific dating [url=http://loveepicentre.com/]woman dating short man tips[/url] bad breath biggest dating characteristic
beverly ma dating [url=http://loveepicentre.com/]male 60 mission viejo ca dating[/url] hot young thai women for dating
sex dating in sauk village illinois [url=http://loveepicentre.com/]dallas green dating[/url] single professional dating
cosmo dating [url=http://loveepicentre.com]gay teen dating in mn[/url] space single dating
online dating competitors [url=http://loveepicentre.com/map.php]armenian single dating site[/url] dating the rem 760 gamemaster
[url=http://audiobooksworld.co.uk/it/Mind-Is-a-Myth/p224762/][img]http://audiobooksworld.co.uk/image/1.gif[/img][/url]
[url=http://buyoem.co.uk/product-14813/PopChar-Mac]PopChar [Mac] - Cheap Legal OEM Software, Software Sale, Download OEM[/url] drop box software
[url=http://buyoem.co.uk/es/product-37214/Mixpad-Audio-Mixer-1-1][img]http://buyoem.co.uk/image/3.gif[/img][/url]
[url=http://buyoem.co.uk/search]Search - Software Store[/url] gps travel map software
[url=http://buyoem.co.uk/es/category-100-114/Otros?page=2][img]http://buyoem.co.uk/image/5.gif[/img][/url]
[url=http://buyoemsoftware.co.uk/product-37225/Notepad-Pro-3-2]Notepad Pro 3.2 - Software Store[/url] best software for ubuntu
[url=http://buyoemsoftware.co.uk/es/news-31/Google-s-new-app-strategy-Mobile-comes-first][img]http://buyoem.co.uk/image/2.gif[/img][/url]
[url=http://buyoemsoftware.co.uk/product-36960/FileMaker-Pro-Advanced-11-0]FileMaker Pro Advanced 11.0 - Download OEM, Software Sale, OEM Software[/url] grant proposal writing software
[url=http://buyoemsoftware.co.uk/product-18302/Bookdog-Mac][img]http://buyoem.co.uk/image/2.gif[/img][/url]
[url=http://buysoftwareonline.co.uk/product-37352/Ultra-Video-Splitter-5-0]Ultra Video Splitter 5.0 - Software Store[/url] blackberry desktop software for curve 8310
[url=http://buysoftwareonline.co.uk/fr/product-16444/BitClamp-Mac][img]http://buyoem.co.uk/image/3.gif[/img][/url]
find a good pharmacy http://certifiedpharmacy.co.uk/products/zestril.htm signature pharmacy internal revenue service [url=http://certifiedpharmacy.co.uk/products/uroxatral.htm]rie aid pharmacy[/url]
cvs pharmacy picture http://certifiedpharmacy.co.uk/products/aricept.htm clinical pharmacy software [url=http://certifiedpharmacy.co.uk/products/aldactone.htm]aldactone[/url]
middletown pharmacy http://certifiedpharmacy.co.uk/products/erectalis.htm elderly health care pharmacy [url=http://certifiedpharmacy.co.uk/products/singulair.htm]discount internet pharmacy[/url]
pharmacy somatropin prices http://certifiedpharmacy.co.uk/products/celexa.htm bm pharmacy [url=http://certifiedpharmacy.co.uk/products/bactroban.htm]bactroban[/url]
wv board of pharmacy http://certifiedpharmacy.co.uk/products/retin-a-0-02-.htm undergraducated pharmacy cbl [url=http://certifiedpharmacy.co.uk/products/generic-keflex.htm]online pharmacy com[/url]
pet pharmacy plus http://certifiedpharmacy.co.uk/products/tadacip.htm mexican pharmacys [url=http://certifiedpharmacy.co.uk/products/levothroid.htm]levothroid[/url]
college pharmacy compounding lab veterinarian http://certifiedpharmacy.co.uk/products/xenical.htm admissions officer for strathclyde uni pharmacy [url=http://certifiedpharmacy.co.uk/products/hyzaar.htm]indian pharmacy no prescription xanax[/url]
quality improvement and pharmacy http://certifiedpharmacy.co.uk/products/fincar.htm express script pharmacy toll free telephone [url=http://certifiedpharmacy.co.uk/products/alavert.htm]alavert[/url]
ORA-01403: No se ha encontrado ningún dato
tendras alguna idea de por que me sale esto,
Gracias