web-dev-qa-db-ja.com

CSVからOracle SQLデータベースを更新する

私は最初にグーグルを試しましたが運がありませんでした。 csvファイルからテーブルを更新することは可能ですか?私はSQL開発者を使用しており、スクリプトを使用して編集した行をcsvファイルにエクスポートしています。クライアントからcsvファイルを介して編集された行を更新したいと思います。クライアントがすでにミラーテーブルを持っているので、ファイル全体をインポートしたくありません。csvファイルのデータを更新したいだけです。これは可能ですか?

そうでなければ、何が最善のアプローチでしょうか?

5
xiltepin

外部テーブルを利用することをお勧めします。 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.

次に、外部テーブルを作成します。

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')
       );

フラットファイルのデータで更新するテーブルがすでにあると仮定します。

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');

(ここでは、サンプルデータをロードしました。)

これがあなたのinfo.datに含まれるものです。例えば:

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

この時点で、既存のテーブルを上記の外部テーブルのデータで更新するだけです。

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);

結果は次のとおりです。

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