Oracle用DBlink导blob大字段(ORA-22992)

ORA-22992:无法使用从远处表选择LOB定位器
错误说明: [Error] Execution (1: 1): ORA-22992: 无法使用从远程表选择的 LOB 定位器
原因分析: 用dblink从远程数据库向本地数据库 insert数据时, 远程表中含有BLOB字段, 在select 和 insert into操作时, 报错:
"ORA-22992: 无法使用从远程表选择的 LOB 定位器"错误,通过创建临时表并从临时成功把数据插入到目的表中。

解决办法:
1、 创建一张临时表。

create global temporary table base_uploadfileblob_temp1108 as select * from base_uploadfileblob where 1=2;

2、 然后利用database link把远程数据先insert到临时表中,insert后先不要commit,否则commit后临时表中数据就会丢失。
注意 : 2.1 需要保证临时表空间足够大, 在操作时修改临时表空间会丢失全部blob 数据;
2.2 在操作期间不要commit, 否则临时表空间会被释放, 从而无法插入数据。

insert into base_uploadfileblob_temp1108 select a.* from base_uploadfileblob@MDM6DBLINK a
/*数据量特别大的话, 可以先加条件, 试试部分数据*/
where a.PATH_='/_MDMFILE/import/import_excel/lichao_201603211458525282287.xlsx';
--where a.PATH_ LIKE '%.ftl';

3、 将临时表中的数据insert到目标库表

insert into base_uploadfileblob t (select * from base_uploadfileblob_temp1108);
--如果字段不匹配的话,手动去对应字段
insert into base_uploadfileblob t (t.PATH_,t.CONTENT_) (select * from base_uploadfileblob_temp1108);

Oracle用DBlink导blob大字段(ORA-22992)_第1张图片

4、 操作完毕,将临时表drop;

​​​​​​​drop table base_uploadfileblob_temp1108;

说明 : 此方法是将blob大字段, 存在临时表空间里面, 然后用 临时表空间 表空间 里面插入数据,
注意 : 1. 需要保证临时表空间足够大, 在操作时修改临时表空间会丢失全部blob 数据;
2. 在操作期间不要commit, 否则临时表空间会被释放, 从而无法插入数据。

你可能感兴趣的:(数据库,mysql,java,python,oracle)