【问题标题】:How to upload to an XML Document to Oracle from Delphi如何从 Delphi 将 XML 文档上传到 Oracle
【发布时间】: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 实例。完善后我会发布解决方案。

【问题讨论】:

    标签: oracle delphi xmltype


    【解决方案1】:

    ORA-22816 错误原因:

    对象类型列、LONG 列、远程表、带有子查询的 INSERT 和 INSTEAD OF 触发器目前不支持 RETURNING 子句。


    尝试转换为 varchar2。

     declare 
          content varchar2(4000);
           begin
            insert  
          into XML_UPLOADED_DOC
          (CONTENT) values (XmlType('<place-marker/>'))
          returning CAST(content AS VARCHAR2(4000)) into content;
          end;
    

    这样你就不会出错了。

    【讨论】:

    • 这不起作用,因为如问题中所述,文档超过了 4k 标记。转换为 varchar2 会破坏存储过程。但是,我认为您的回答建议在 Delphi 客户端使用 TStoredProc,而不是 TSQLQuery,如果是这种情况,我同意您使用 sproc 的一般方法(而不是封装插入语句的 TSQLQuery。)
    • @SeanB.Durkin 抱歉,我错过了 VARCHAR2 的部分。无论如何,您似乎已经找到了解决方案。祝你好运!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-10
    • 2011-12-19
    • 1970-01-01
    • 1970-01-01
    • 2023-03-12
    • 2010-12-31
    相关资源
    最近更新 更多