【问题标题】:How can I avoid that this java.sql.SQLException: ORA-01704: string literal too long is thrown?如何避免抛出这个 java.sql.SQLException: ORA-01704: string literal too long?
【发布时间】:2015-06-10 15:45:59
【问题描述】:

我正在开发一个旧的 Java 应用程序,但我对这种在 Oracle 数据库上执行简单插入查询的方法有一些问题:

private boolean insertFlussoXmlsdi(DBOperatore op, String numeroFattura, String dataFattura, String fatturaXml) {

    StringBuffer query = new StringBuffer();

    query.append("INSERT INTO FLUSSO_XMLSDI (NUMERO_FATTURA, DATA_EMISSIONE, XML) VALUES (");
    query.append(numeroFattura);
    query.append(", date'");
    query.append(dataFattura);
    query.append("', '");
    query.append(fatturaXml);
    query.append("')");


    try {
        Statement stmt = op.getConnessione().createStatement();
        stmt.execute(query.toString());

    } catch (SQLException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();

        TraceLog.scrivi("INSERIMENTO FATTURA", "ERRORE inserimento fattura con numero fattura: " + numeroFattura, false, TraceLog.lowConsole + TraceLog.highTrace + TraceLog.highLog);

        return false;
    }

    TraceLog.scrivi("INSERIMENTO FATTURA", "Inserimento fattura con numero fattura: " + numeroFattura, false, TraceLog.lowConsole + TraceLog.highTrace + TraceLog.highLog);

    return true;

}    

问题是 String fatturaXml 参数代表一个 XML 文件,而且它非常大。因此,当执行上一个查询时,我发现抛出了这个异常:

java.sql.SQLException: ORA-01704: string literal too long

如何解决这个问题并正确插入记录?

Tnx

【问题讨论】:

  • 你的表结构?
  • FLUSSO_XMLSDI 中的xml 列的数据类型是什么?为什么要使用文字而不是使用绑定变量来构建 SQL 语句?这是你可以改变的吗?
  • 您是否将其存储在 varchar 类型的字段中?如果您可以访问数据库,则可以使用CLOB 数据类型来存储 xml 文件,而不是 varchar 以防大文件

标签: java sql oracle oracle11g ora-01704


【解决方案1】:

如果尝试将大于 4000 个字符的数据插入列 - VARCHAR2 ,则会出现错误 ORA-01704。检查下面的SO帖子

Error : ORA-01704: string literal too long

【讨论】:

  • 该错误意味着字符串对于 SQL 语句来说太大,对于列来说不一定太大。如果表格太大,错误消息将是ORA-12899: value too large for column...
【解决方案2】:

您可以使用我在 IBM 大型机上使用的一种非常古老的方法来存储大数据:将字符串拆分成块,然后存储块:

CREATE TABLE mystore(referenceid int, somecounter int, data varchar(255));

还有一个循环:

public void insertSomeData(Connection connection,String inputData,int referenceId) {
    int i=0;
    String insertSql="INSERT INTO mystore (referenceid,somecounter,data) VALUES (?,?,?)";
    PreparedStatement pstmt=connection.prepareStatement(insertSql);
    int i=0;
    boolean keepGoing=true;
    while(keepGoing) {
        // Take 120 bytes only: Just in case of double byte encoding
        String substr=new String();
        if(inputData.length()>120) {
            substr=inputData.substring(0,120);
            inputData=inputData.substring(120);
        }
        else {
            substr=inputData;
            // Lets get out of this loop
            keepGoing=false;
        }
        pstmt.setInt(1,referenceId);
        pstmt.setInt(2,i);
        pstmt.setString(3,substr);
        pstmt.execute();
        pstmt.clearBatch();
        i++;
    }
    pstmt.close();
}

附:不要使用您的 query.append 代码:它对 SQL 注入和未转义的数据很敏感。请改用 PreparedStatement。

【讨论】:

  • 这个错误意味着字符串对于 SQL 语句来说太大了,对于列来说不一定太大。如果表格太大,错误消息将是ORA-12899: value too large for column...
猜你喜欢
  • 1970-01-01
  • 2012-01-27
  • 2023-03-27
  • 1970-01-01
  • 2016-05-02
  • 2012-07-08
  • 1970-01-01
  • 2013-08-09
  • 2019-10-17
相关资源
最近更新 更多