0

我有一个用户上传的 csv 文件,我需要将其作为 Clob 存储在 oracle 表中。

因此我有这个代码:

 MultipartHttpServletRequest mr = (MultipartHttpServletRequest) ctx.getRequest();
    final MultipartFile f = mr.getFile("datafile");
    final InputStream is = f.getInputStream();
     ...
   jdbc.getJdbcOperations().execute(sql, new PreparedStatementCallback<Integer>() {
     public Integer doInPreparedStatement(final PreparedStatement psInsert) throws SQLException,
                            DataAccessException {
     ...
    psInsert.setCharacterStream(1, new InputStreamReader(is));
    psInsert.executeUpdate();
   }
});

另外,我尝试过使用 PreparedStatement 的 setClob 和 setAsciiStream 方法,也尝试过这种方法(设置文件大小),但结果是一样的 -

java.lang.AbstractMethodError
    org.apache.commons.dbcp.DelegatingPreparedStatement.setAsciiStream(DelegatingPreparedStatement.java:338)
    org.apache.commons.dbcp.DelegatingPreparedStatement.setAsciiStream(DelegatingPreparedStatement.java:338)
    org.apache.commons.dbcp.DelegatingPreparedStatement.setAsciiStream(DelegatingPreparedStatement.java:338)

底层 InputStream 是 ByteArrayInputStream (如果这可能会有所不同)

PS:该表确实有 CLOB 字段:

P_FILE CLOB NOT NULL,

UPD:我实际上还没有尝试过 Oracle 实现的方法。它有效,唯一的问题是,与 PreparedStatement 接口中的方法相比,oracle 驱动程序并未实现所有方法。查看可能的可用方法的类是 OraclePreparedStatement ...

4

2 回答 2

1

AbstractMethodError javadoc

当应用程序尝试调用抽象方法时抛出。通常,这个错误会被编译器捕获;如果自上次编译当前执行的方法后某些类的定义发生了不兼容的更改,则此错误只会在运行时发生

检查以确保您的所有课程都是最新的。我会对您的整个项目进行清理和重建。此外,请确保您的编译时和运行时类路径是等效的(就库版本等而言)

于 2012-09-07T16:14:15.177 回答
0

Sormula通过使用TypeTranslator可以轻松读取/写入任何类型。请参阅项目中的 org.sormula.examples.blob 包。CLOB 的代码与此类似。

public class WidgetTanslator1 implements TypeTranslator<Widget>
{
    public void write(PreparedStatement preparedStatement, int parameterIndex, Widget parameter) throws Exception
    {
        // convert from domain object to bytes
        ByteArrayOutputStream bos = new ByteArrayOutputStream(1000);
        try (ObjectOutputStream oos = new ObjectOutputStream(bos))
        {
            oos.writeObject(parameter);

            // convert bytes to jdbc blob
            preparedStatement.setBlob(parameterIndex, new SerialBlob(bos.toByteArray()));
        }
    }


    public Widget read(ResultSet resultSet, int parameterIndex) throws Exception
    {
        // convert from jdbc blob to bytes to domain object
        Blob blob = resultSet.getBlob(parameterIndex);
        try (ObjectInputStream ois = new ObjectInputStream(new ByteArrayInputStream(blob.getBytes(1, (int)blob.length()))))
        {
            return (Widget)ois.readObject();
        }
    }
}

像这样注释 CLOB 字段:

@ImplicitType(translator=WidgetTanslator1.class)
Widget widget;
于 2012-09-08T14:59:20.987 回答