私は最初にグーグルを試しましたが運がありませんでした。 csvファイルからテーブルを更新することは可能ですか?私はSQL開発者を使用しており、スクリプトを使用して編集した行をcsvファイルにエクスポートしています。クライアントからcsvファイルを介して編集された行を更新したいと思います。クライアントがすでにミラーテーブルを持っているので、ファイル全体をインポートしたくありません。csvファイルのデータを更新したいだけです。これは可能ですか?
そうでなければ、何が最善のアプローチでしょうか?
外部テーブルを利用することをお勧めします。 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