ORA-01704:字符串文字太长'在Oracle XMLTYPE列类型中插入XML文档时出错'

Sea*_*ide 2 xml oracle

尝试从Oracle表中的SQL表插入数据时,出现此错误“ ORA-01704:字符串文字太长”。在我的Oracle表中,我有一列具有XMLTYPE列类型。在创建表时,我指定了XML列,如下所示:

  CREATE TABLE REPORTS (
       ...
    XML XMLTYPE NULL ); 
Run Code Online (Sandbox Code Playgroud)

除了此列之外,在它之前还有其他23列,并且当我从插入语句XML列中排除时,insert正在传递。XML列包含表中所有其他23列的XML格式的数据。是否应该在XML列中添加一些其他规范来说明长度或其他?

Nic*_*k S 5

我的猜测是您要将XML作为文字传递给insert语句。Oracle的SQL在一个文字中最多只能处理4000个字符。否则,您需要使用绑定变量并将其分块传递。或者,您可以使用PL / SQL。

例如,这应该没有问题,因为文字

<MyMessage>Meeesaaagee</MyMessage> 
Run Code Online (Sandbox Code Playgroud)

仅34个字符:

CREATE TABLE TEST_REPORTS
(
   ID            NUMBER,
   DESCRIPTION   VARCHAR2 (50),
   XML           XMLTYPE NULL
);

INSERT INTO TEST_REPORTS (ID, DESCRIPTION, XML)
     VALUES (1, 'BLAH BLAH', XMLTYPE.CREATEXML ('<MyMessage>Meeesaaagee</MyMessage>'));

COMMIT;
Run Code Online (Sandbox Code Playgroud)

但如果您有:Meeesaaagee(另加3976个字符)

您将得到ORA-01704:字符串文字太长错误。

您可以尝试:

DECLARE
    in_xml_value varchar2(32767);
BEGIN
    in_xml_value := '<MyMessage>MeeesaaageeBLAHBLAHBLAH<--repeat--></MyMessage>';
    INSERT INTO TEST_REPORTS (ID, DESCRIPTION, XML)
     VALUES (1, 'BLAH BLAH', XMLTYPE.CREATEXML (in_xml_value);
    commit;
END;
/
Run Code Online (Sandbox Code Playgroud)

不用PL / SQL代码来完成它,并使用绑定变量,那么您将不得不与应用程序开发人员联系。它在Oracle之外(也不在我的知识范围内)。