Hola,
Un poco del entorno.
Código:
oracle@buo:~/scripts/data> pwd
/home/oracle/scripts/data
oracle@buo:~/scripts/data> cat nombres.dat
1|"nombre 1"
2|"nombre 2"
3|"nombre 3"
4|"nombre 4"
5|"nombre 5"
6|"nombre 6"
7|"nombre 7"
8|"nombre 8"
9|"nombre 9"
Estoy trabajando en un directorio con contiene los datos externos, esto estaria bien definirlo de antemano, asi puede alojar todos los datos externos en una sola ubicacion y tambien puedes hacer backups.
Código:
CREATE OR REPLACE DIRECTORY external_data
AS '/home/oracle/scripts/data';
CREATE TABLE external_table
(id NUMBER,
nombre VARCHAR2(100)
)
ORGANIZATION EXTERNAL
(
TYPE ORACLE_LOADER
DEFAULT DIRECTORY external_data
ACCESS PARAMETERS
(
records delimited by newline
badfile external_data:'nombres.bad'
logfile external_data:'nombres.log'
fields terminated by '|'
missing field values are null
( id, nombre )
)
LOCATION ('nombres.dat')
)
;
Ahora creamos un objeto directorio y la tabla externa que se alimenta con el fichero nombres.dat. Las tablas externas utilizan el motor del SQL*Loader para la carga de datos, asi que puedes esperar que esto sea rapido.
Código:
SQL> set lines 150
SQL> col nombre format a40
SQL> select * from external_table;
ID NOMBRE
---------- ----------------------------------------
1 "nombre 1"
2 "nombre 2"
3 "nombre 3"
4 "nombre 4"
5 "nombre 5"
6 "nombre 6"
7 "nombre 7"
8 "nombre 8"
9 "nombre 9"
9 rows selected.
Ya tienes acceso al fichero nombres.dat a traves de una tabla externa.
Código:
SQL> create table t1 (id number, nombre varchar2(100));
Table created.
SQL> select * from t1;
no rows selected
Creamos la tabla de destino, la que actualizaremos con el merge.
Código:
MERGE INTO t1 D
USING (SELECT id, nombre FROM external_table) S
ON (D.id = S.id)
WHEN MATCHED THEN UPDATE SET D.nombre = S.nombre
WHEN NOT MATCHED THEN INSERT (D.id, D.nombre)
VALUES (S.id, S.nombre)
;
9 rows merged.
Ejecutamos la siguiente sentencia SQL....
Código:
SQL> select * from t1;
ID NOMBRE
---------- ----------------------------------------
1 "nombre 1"
2 "nombre 2"
3 "nombre 3"
4 "nombre 4"
5 "nombre 5"
6 "nombre 6"
7 "nombre 7"
8 "nombre 8"
9 "nombre 9"
9 rows selected.
Listo!!, ahora lo unico que queda por hacer es un cron que copie el fichero nombres.dat al directorio de datos y ejecute la sentencia MERGE.
Saludos