Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/15.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/10.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
ORA-01704:字符串文字太长';在Oracle XMLTYPE列类型';中插入XML文档时出错;_Xml_Oracle - Fatal编程技术网

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

ORA-01704:字符串文字太长';在Oracle XMLTYPE列类型';中插入XML文档时出错;,xml,oracle,Xml,Oracle,当我试图从Oracle表中的SQL表中插入数据时,出现了错误“ORA-01704:字符串文字太长”。在我的Oracle表中,有一个列的类型为XMLTYPE column。创建表时,我指定了如下XML列: CREATE TABLE REPORTS ( ... XML XMLTYPE NULL ); 除此列之外,在它之前还有其他23列,当我从insert语句XML列中排除时,insert正在传递。XML列包含表中所有其他23列的XML格式数据。我是否应该在XML列中为长

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

  CREATE TABLE REPORTS (
       ...
    XML XMLTYPE NULL ); 

除此列之外,在它之前还有其他23列,当我从insert语句XML列中排除时,insert正在传递。XML列包含表中所有其他23列的XML格式数据。我是否应该在XML列中为长度或其他内容添加一些附加规范

错误在哪里?显示insert语句。我认为这里没有任何问题:

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>'));
创建表测试报告
(
身份证号码,
说明VARCHAR2(50),
XML XMLTYPE NULL
);
插入测试报告(ID、说明、XML)
值(1,'BLAH BLAH',XMLTYPE.CREATEXML('meeesaagee');

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

例如,这应该可以正常工作,因为

<MyMessage>Meeesaaagee</MyMessage> 
meeesaagee
只有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;
创建表测试报告
(
身份证号码,
说明VARCHAR2(50),
XML XMLTYPE NULL
);
插入测试报告(ID、说明、XML)
值(1,'BLAH BLAH',XMLTYPE.CREATEXML('meeesaagee');
犯罪
但如果你有: Meeesaaagee(+3976个额外字符)

您将得到ORA-01704:string literal过长错误

你可以试试:

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;
/
声明
in_xml_值varchar2(32767);
开始
in_xml_值:='meeesaaageeblahblahblahblah';
插入测试报告(ID、说明、XML)
值(1,'BLAH BLAH',XMLTYPE.CREATEXML(in_xml_value);
犯罪
结束;
/

使用PL/SQL代码并使用绑定变量,您必须与应用程序开发人员交谈。这不属于Oracle(也不属于我的知识范围).

您会遇到什么错误?请将此添加到问题中。您使用的是Oracle的哪个版本,以及特定的
插入中的XML有多大?
?我使用的是“Oracle Database 11g Enterprise Edition 11.2.0.3.0-64位生产版”,XML大小为4,39 KB(4.497字节)该语句一切正常。我知道,因为我在另一个表中使用了它,但该表的XML文档比这个表小,而且XML插入到表中的效果很好。我认为问题在于XML文档的大小。Nick S,很抱歉回答得太晚。使用PL/SQL是唯一的解决方案。我的问题是如何传递t这个PL/SQL过程的参数和XML参数在值varchar2(32767)中分配给这个declare参数?PL/SQL不是我的强项。谢谢你的回答。Nick S,经过一段时间的测试,我成功地用你的PL/SQL方法解决了我的问题。非常感谢!