web-dev-qa-db-fra.com

Mettre à jour la base de données Oracle SQL de CSV

J'ai essayé Google au début mais pas de chance. Est-il possible de mettre à jour les tables du fichier CSV? J'utilise SQL Developer et j'utilise un script pour exporter des lignes modifiées vers un fichier CSV. Je voudrais mettre à jour les lignes modifiées via ce fichier CSV d'un client. Je ne veux pas importer tout le fichier car le client a déjà une table miroir, je voudrais juste mettre à jour les données de ce qu'il figure dans le fichier CSV. Est-ce possible?

Sinon, quelle serait la meilleure approche?

5
xiltepin

Je vous suggérerais de faire appel de tables externes. Vous pouvez créer une table externe sur votre fichier CSV à l'aide de Oracle_LOADER pilote puis mettez à jour votre table existante avec des données dans votre table externe à l'aide de DML (MERGE par exemple).

Consultez le Guide des utilitaires Oracle pour des informations détaillées.

Ce qui suit est mon échantillon de la manière dont vous pouvez mettre à jour les tables à partir de fichiers plats.

Vous pouvez d'abord créer le répertoire dans lequel votre fichier plat sera situé:

SQL> create directory ext_tab_dir as '/home/Oracle/ora_load';
Directory created.

SQL> grant read, write on directory ext_tab_dir to spongebob;
Grant succeeded.

Ensuite, vous créez votre table externe:

SQL> CREATE TABLE emp_load (empid          number(3), 
                            first_name     CHAR(15), 
                            last_name      CHAR(20), 
                            year_of_birth  CHAR(4))
       ORGANIZATION EXTERNAL (
         TYPE Oracle_LOADER DEFAULT DIRECTORY ext_tab_dir
         ACCESS PARAMETERS (RECORDS FIXED 21 FIELDS (
           empid          char(1),
           first_name     CHAR(7),
           last_name      CHAR(8),
           year_of_birth  CHAR(4)))
         LOCATION ('info.dat')
       );

Nous supposerons que vous avez déjà la table que vous souhaitez mettre à jour avec des données à partir du fichier plat:

SQL> CREATE TABLE emp (empid         number(3), 
                      first_name     CHAR(15), 
                      last_name      CHAR(20), 
                      year_of_birth  CHAR(4));
SQL> insert into emp values(1, 'SpongeBob', 'SquarePants', '1997');
SQL> insert into emp values(2, 'Patrick',   'Star',        '1997');
SQL> insert into emp values(3, 'Squidward', 'Tentacles',   '1997');

(Ici, je viens de le charger avec des données d'échantillonnage.)

Maintenant c'est ce que votre info.dat contient, par exemple:

[Oracle@oca ~]$ cat ora_load/info.dat
1Alvin  Tolliver1976
2KennethBaer    1963
3Mary   Dube    1973
4NandiniShastri 1985

À ce stade, vous allez simplement mettre à jour votre table existante avec les données ci-dessus de la table externe:

SQL> merge into emp e1
       using emp_load e2
       on (e1.empid = e2.empid)
       when matched then update set e1.first_name    = e2.first_name,
                                    e1.last_name     = e2.last_name
       when not matched then insert
         values (e2.empid, e2.first_name, e2.last_name, e2.year_of_birth);

Voici ce que vous obtiendrez à la suite:

SQL> select * from emp;
     EMPID FIRST_NAME      LAST_NAME            YEAR
---------- --------------- -------------------- ----
         1 Alvin           Tolliver             1997
         2 Kenneth         Baer                 1997
         3 Mary            Dube                 1997
         4 Nandini         Shastri              1985
5
Yasir Arsanukaev