我收到一个错误SQL*Loader -606,这意味着:
SQL*Loader 控制文件的 INTO TABLE 子句中指定的同义词通过数据库链接指定远程对象。在 INTO TABLE 子句中只能指定现有本地表的同义词。
有什么方法可以使用 SQL*Loader 插入远程表?
我收到一个错误SQL*Loader -606,这意味着:
SQL*Loader 控制文件的 INTO TABLE 子句中指定的同义词通过数据库链接指定远程对象。在 INTO TABLE 子句中只能指定现有本地表的同义词。
有什么方法可以使用 SQL*Loader 插入远程表?
因为您使用的是 10g,所以您可以使用外部表而不是 SQL 加载器。
设置外部表很容易。 了解更多。
要让外部表获取一个新文件(您可能需要这样做,因为您有一个重复的过程),请执行以下操作:
alter table your_ext_table_name location ('<newfile.name>')
/
然后你可以这样做:
insert into whatever_table@remote_db
select * from your_ext_table_name
/
这避免了两批 DML。外部表不如经过良好调整的 SQL*Loader 进程快,但与网络流量税(在您的场景中是不可避免的)相比,这将是微不足道的。
create table temp_table as select * from remote_table@remote_db where 1 = 2;
load using sql*loader into temp_table;
insert into remote_table@remote_db select * from temp_table;
在有表的服务器上运行 SQL Loader?
一定是为什么不这样做的原因,但这对我来说似乎是最简单的。
如果您不能使用外部表(例如,因为数据文件在客户端机器上而不是在数据库服务器上),您可以插入到远程对象的视图中。
例如
create database link schema1 connect to schema1 identified by schema1 using 'XE';
create view schema1_test_vw as select * from test@schema1;
load data
infile *
append
into table schema1_test_vw
( id POSITION(1:4) INTEGER)
begindata
1001
1002
1003
我的 XE 测试成功了。对于视图,所有列大小、数据类型等都固定在本地模式上,因此 sqlldr 没有问题。