从 CSV 更新 oracle sql 数据库

xil*_*pin 5 oracle oracle-11g import csv

我一开始试过谷歌,但没有运气。是否可以从 csv 文件更新表格?我正在使用 SQL 开发人员,并且正在使用脚本将编辑过的行导出到 csv 文件。我想通过客户端的 csv 文件更新编辑过的行。我不想导入整个文件,因为客户端已经有一个镜像表,我只想更新 csv 文件中的数据。这可能吗?

如果不是最好的方法是什么?

Yas*_*irA 5

我建议您使用外部表。您可以使用ORACLE_LOADER驱动程序在 CSV 文件上创建外部表,然后使用 DML(MERGE例如)使用外部表中的数据更新现有表。

有关详细信息,请参阅 Oracle 实用程序指南。

下面是我如何从平面文件更新表的示例。

首先,创建平面文件所在的目录:

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.
Run Code Online (Sandbox Code Playgroud)

然后创建外部表:

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')
       );
Run Code Online (Sandbox Code Playgroud)

我们假设您已经拥有要使用平面文件中的数据更新的表:

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');
Run Code Online (Sandbox Code Playgroud)

(在这里,我只是加载了示例数据。)

现在这就是您所info.dat包含的内容,例如:

[oracle@oca ~]$ cat ora_load/info.dat
1Alvin  Tolliver1976
2KennethBaer    1963
3Mary   Dube    1973
4NandiniShastri 1985
Run Code Online (Sandbox Code Playgroud)

此时,您只需使用外部表中的上述数据更新现有表:

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);
Run Code Online (Sandbox Code Playgroud)

结果如下:

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
Run Code Online (Sandbox Code Playgroud)