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

时间:2016-07-01 14:07:53

标签: xml oracle

我收到此错误' ORA-01704:字符串字面太长'而我正在尝试从Oracle表中的SQL表中插入数据。在我的Oracle表中,我有一个XMLTYPE列类型的列。当我创建表时,我指定了这样的XML列:

ExecutorService threadExecutor = Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors());
for(int i = 0; i < size; i++) {
    if(expr != null) {
        threadExecutor.execute(new Runnable() {

            @Override
            public void run() {
                doSmth();
            }
        });
    }
}

threadExecutor.shutdown();
try {
    threadExecutor.awaitTermination(10, TimeUnit.MINUTES);
} catch (InterruptedException ex) {
    // handle timeout
}

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

2 个答案:

答案 0 :(得分:4)

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

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

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;

只有34个字符:

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;
/

但如果你有: Meeesaaagee(+ 3976个额外字符)

你会得到ORA-01704:字符串文字错误。

你可以尝试:

import UIKit

@IBDesignable
class RoundButton: UIButton {

    override func awakeFromNib() {
        setupView()
    }

    override func prepareForInterfaceBuilder() {
        super.prepareForInterfaceBuilder()
        setupView()
    }

    func setupView() {
        let radius = self.frame.size.height / 2
        layer.cornerRadius = radius
    }
}

没有PL / SQL代码并使用绑定变量,你必须与应用程序开发人员交谈。它不在Oracle之外(据我所知)。

答案 1 :(得分:0)

错误在哪里?显示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>'));