Ver Mensaje Individual
  #10 (permalink)  
Antiguo 01/11/2007, 15:39
Avatar de matanga
matanga
 
Fecha de Ingreso: octubre-2007
Ubicación: España
Mensajes: 1.091
Antigüedad: 17 años, 3 meses
Puntos: 85
Re: Realizar actualización de tabla a partir de fichero

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