Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何从Delphi将XML文档上载到Oracle_Oracle_Delphi_Xmltype - Fatal编程技术网

如何从Delphi将XML文档上载到Oracle

如何从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)

如何从使用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;
工具版本 服务器横幅返回

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的部分。无论如何,你似乎已经找到了解决办法。祝你好运