如何从Delphi将XML文档上载到Oracle
如何从使用DBX库的Delphi程序将XML文档(Oracle类型为XMLType的数据)上传到Oracle数据库的表中 服务器端的示例 假设我们有一个简单的表,其列类型为XMLType。我们想插入一个包含XML文档的新记录。该文档编码为字符串,长度超过varchar2的4000个字符限制如何从Delphi将XML文档上载到Oracle,oracle,delphi,xmltype,Oracle,Delphi,Xmltype,如何从使用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)
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;
工具版本
服务器横幅返回
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) 调用最后一个存储过程将clob转换为XMLType实例。我将在抛光后发布解决方案。ORA-22816错误原因: 对象类型列、长列、远程表、INSERT with subquery和INSTEAD OF触发器当前不支持RETURNING子句
试着投瓦查尔2
declare
content varchar2(4000);
begin
insert
into XML_UPLOADED_DOC
(CONTENT) values (XmlType('<place-marker/>'))
returning CAST(content AS VARCHAR2(4000)) into content;
end;
声明
内容物varchar2(4000);
开始
插入
上传到XML文档中
(内容)值(XmlType(“”))
将CAST(内容为VARCHAR2(4000))返回到内容中;
结束;
这样您就不会有错误。ORA-22816错误原因: 对象类型列、长列、远程表、INSERT with subquery和INSTEAD OF触发器当前不支持RETURNING子句
试着投瓦查尔2
declare
content varchar2(4000);
begin
insert
into XML_UPLOADED_DOC
(CONTENT) values (XmlType('<place-marker/>'))
returning CAST(content AS VARCHAR2(4000)) into content;
end;
声明
内容物varchar2(4000);
开始
插入
上传到XML文档中
(内容)值(XmlType(“”))
将CAST(内容为VARCHAR2(4000))返回到内容中;
结束;
这样就不会有错误。这不起作用,因为如问题所述,文档超过了4k标记。向varchar2施放将破坏存储过程。但是,我认为您的答案建议在Delphi客户端使用TStoredProc,而不是TSQLQuery,如果是这种情况,我同意您使用存储过程(而不是TSQLQuery封装insert语句)的一般方法。@SeanB.Durkin抱歉,我错过了VARCHAR2的部分。无论如何,你似乎已经找到了解决办法。祝你好运这是行不通的,因为如问题中所述,文档超过了4k标记。向varchar2施放将破坏存储过程。但是,我认为您的答案建议在Delphi客户端使用TStoredProc,而不是TSQLQuery,如果是这种情况,我同意您使用存储过程(而不是TSQLQuery封装insert语句)的一般方法。@SeanB.Durkin抱歉,我错过了VARCHAR2的部分。无论如何,你似乎已经找到了解决办法。祝你好运