【发布时间】:2016-03-23 08:26:52
【问题描述】:
如何使用 DBX 库从 Delphi 程序将 XML 文档(Oracle 类型 XMLType 的数据)上传到 Oracle 数据库的表中?
服务器端示例
假设我们有一个包含 XMLType 类型列的简单表。我们想要插入一条带有 XML 文档的新记录。编码为字符串的文档长度超过 varchar2 的 4000 个字符限制
create global temporary table XML_UPLOADED_DOC(
DOC_ID number not null,
CONTENT XMLType not null)
on commit preserve rows;
alter table XML_UPLOADED_DOC add (
constraint XML_UPLOADED_DOC_PK primary key (DOC_ID));
create sequence XML_UPLOADED_DOC_SEQ;
create or replace trigger XML_UPLOADED_DOC_BIR
before insert on XML_UPLOADED_DOC
for each row
begin
select XML_UPLOADED_DOC_SEQ.NEXTVAL
into :new.DOC_ID
from dual;
end;
到目前为止我所尝试的
这个 Delphi 程序,当运行时 ...
procedure UploadDoc( Con: TSQLConnection; const Doc: IXMLDocument);
var
Query: TSQLQuery;
Param: TParam;
begin
Query := TSQLQuery.Create( nil);
Query.SQLConnection := Con;
Query.SQL.Add( 'insert into XML_UPLOADED_DOC ');
Query.SQL.Add( '(CONTENT) values (XmlType(''<place-marker/>'')) ');
Query.SQL.Add( 'returning CONTENT into :content');
Param := Query.ParamByName('content');
Param.DataType := ftString;
Param.ParamType := ptInput;
Param.AsString := Doc.XML.Text;
Query.ExecSQL;
Query.Close;
Query.Free;
end;
...导致此错误...
ORA-22816: unsupported feature with RETURNING clause
工具版本
服务器横幅返回 ...
BANNER
Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 - 64bi
PL/SQL Release 10.2.0.4.0 - Production
CORE 10.2.0.4.0 Production
TNS for IBM/AIX RISC System/6000: Version 10.2.0.4.0 - Productio
NLSRTL Version 10.2.0.4.0 - Production
oracle客户端版本为11g。
Delphi 版本为 Delphi XE7 + Update 1(版本 21.0.17707.5020)
更新
我想我已经制定了一个适用于大型文档的解决方案,大致如下: (1) 使用存储过程(和 DBX TSQLProc 组件)而不是 TSQLQuery; (2) 创建一个带有CLOB列的临时表,将文档分割成小于32k字符的块后,逐部分上传文档的文本等价物。 oracle DBMS_LOB.WriteAppend() 函数可用于逐部分构建 CLOB。此方法可解决驱动程序对 clob 大小的限制。 (3) 调用最后一个 sproc 将 clob 转换为 XMLType 实例。完善后我会发布解决方案。
【问题讨论】: