尝试从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列中添加一些其他规范来说明长度或其他?
我的猜测是您要将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之外(也不在我的知识范围内)。