该 的 “XML->文本的> xml” 的 强> 链可能很复杂,但在某些情况下可能会有所帮助(例如,当插入不是选项而是仅更新时)。 您可以尝试使用varchar列的“n”和平(在目标表或不同的列中,远程数据库上的不同模式中的perheaps),其中“n”是: ceil(max(dbms_lob.getlength(MyXmlColumn))/ 4000)
然后,您可以将这些片段传输到远程临时字段:
insert into RemoteSchema.MyTable(Id, XmlPart1, XmlPart2,...) (select 1 /*some Id*/, dbma_lob.substr(MyXmlColumn.getclobval(), 4000, 1), dbma_lob.substr(MyXmlColumn.getclobval(), 4000, 4001), ... from LocalSchema.MyTable
可以从这样的片段重新组成XmlType:
create or replace function concat_to_xml(p_id number) return xmltype is xml_lob clob; xml xmltype; begin dbms_lob.createtemporary(xml_lob, true); for r in (select XmlPart1, XmlPart2, ... from RemoteSchema.MyTable where Id = p_id) loop if r.XmlPart1 is not null then dbms_lob.writeappend(xml_lob, length(r.XmlPart1), r.XmlPart1); end if; if r.XmlPart2 is not null then dbms_lob.writeappend(xml_lob, length(r.XmlPart2), r.XmlPart2); end if; ... end loop; xml := xmltype(xml_lob); dbms_lob.freetemporary(xml_lob); return xml; end;
最后使用结果更新remothe架构中的任何其他表,如:
update RemoteSchema.MyTable2 t2 set t2.MyXmlColumn = concat_to_xml(1 /*some Id*/);
我们得到ORA-22804,因为我们Oracle数据库中每个Type的实例都有一个OID,它在数据库中是唯一的。我们无法将该OID转移到另一个数据库;在尝试导入具有用户定义类型的模式之前,这让我感到悲痛。我没有意识到它也影响了XMLType,但它是一个Object,所以这并不奇怪。
解决方案是icky:您必须将XML卸载到本地数据库的文本中,然后将其转换回远程数据库中的XML。
我没有分布式数据库设置来立即测试,但如果你很幸运它可能会工作:
INSERT INTO some_schema.some_remote_tab@src_2_trg_dblink(id, code, gen_date, xml_data) SELECT id, code, gen_date, xmltype ( xml_data.asClobVal() ) FROM local_table;
如果 asClobVal() 方法不起作用您可能需要使用SQL函数XMLSERIALIZE()代替。
asClobVal()
XMLSerialize(DOCUMENT xml_data AS CLOB)
如果你真的不走运,你将无法在单个SQL语句中执行此操作,并且您必须使用PL / SQL来解决它。在某种程度上,这取决于您使用的数据库版本;版本越新,你就越有可能在SQL而不是PL / SQL中使用它。
而是执行数据拉取。
(同时..等待oracle找到一些解决方案,以便将来在dblink上执行XML的PUSH)
在远程站点数据库B上创建过程
CREATE OR REPLACE PROCEDURE PR_REMOTE(OP_TOTAL_COUNT OUT NUMBER) IS BEGIN INSERT /*+ DRIVING_SITE(src) */ INTO REMOTE_TABLE TGT_B (XMLDATA_COL) SELECT SRC.XMLDATA FROM LOCAL_TABLE@TGT2SRC_DBLINK SRC; OP_TOTAL_COUNT := SQL%ROWCOUNT; END;
从数据库A调用该过程
DECLARE V_COUNT NUMBER := 0; BEGIN PR_REMOTE(V_COUNT); COMMIT; END;
我遇到了与SQL服务器的异构数据库链接相同的问题。
结束使用 xmltype.getStringVal() 插入SQL Server端的VARCHAR列,因为数据小于4000个字符。
xmltype.getStringVal()
还有 xmltype.getClobVal() 如果超过4000个字符,但我还没有测试过。
xmltype.getClobVal()
尝试以相反的方式做到这一点。这是登录到远程数据库,创建到本地数据库的dblink,并执行这样的插入
INSERT INTO remote_schema.some_remote_tab(id, code, gen_date, xml_data) SELECT id, code, gen_date, xml_data FROM local_table@dblink_to_local_db;