开发者

ORA-01460: unimplemented or unreasonable

I try to run this query in oracle database but unfortunately I receive this error please help me :(

java.sql.SQLException: ORA-01460: unimplemented or unreasonable conversion requested right now that problem solved and I have an other exception: I change this line

 pstmt.setBinaryStream(7, fis, (int) file.length());

with

 pstmt.setBinaryStream(7, fis, (long) file.length());

Exception in thread "AWT-EventQueue-0" java.lang.AbstractMethodError: oracle.jdbc.driver.OraclePreparedStatement.setBinaryStream(ILjava/io/InputStream;J)V

for text file there is no issue开发者_JAVA百科, but when I try to upload a JPG file I receive this error.

    PreparedStatement pstmt = 
                          conn.prepareStatement("INSERT INTO PM_OBJECT_TABLE( " +
                          "N_ACTIVITY_ID, V_NAME,N_SIZE, D_MODIFY,N_CATEGORY, N_NODE_ID ,O_OBJECT) " +
                          " VALUES ( ? , ? , ? , ? , ? , ? ,?)");
                pstmt.setLong(1, N_ACTIVITY_ID);
                pstmt.setString(2, file.getName());
                pstmt.setLong(3, file.length());
                java.util.Date date = new java.util.Date(); 
                java.sql.Date sqlDate = new java.sql.Date(date.getTime()); 
                pstmt.setDate(4,sqlDate);
                pstmt.setInt(5, N_CATEGORY);
                pstmt.setLong(6, N_NODE_ID);
                pstmt.setBinaryStream(7, fis, (int) file.length());
                pstmt.executeUpdate();            


java.lang.AbstractMethodError: com.mysql.jdbc.ServerPreparedStatement.setBinaryStream(ILjava/io/InputStream;J)V

To fix this problem you need to change the call to setBinaryStream so the last parameter is passed as an integer instead of a long.


i found the quote in a blog during facing the same problem

like the above PreparedStatement.setBinaryStream() has THREE overloading methods

and we should use setBinaryStream(columnIndex, InputStream, (((((((((INT)))))))

OTHERWISE, that may cause an error


I also experienced this issue with code that was working and then I got this error suddenly.

I am running Netbeans 8.0.2 with Glassfish 3 In the GlassFish\Glassfish\libs folder I had 2 ojdbc files ojdbc6.jar and ojdbc14.jar It seems that even though ojdbc6 was included into the project libraries ojdbc14 was also loaded in.

I stopped glassfish renamed ojdbc14.jar to ojdbc14.jar.bak then clean and build and deployed the project.

Problem fixed.


I solve my problem by one of previous suggestion:

public String insertBineryToDB(long N_ACTIVITY_ID,int N_CATEGORY,long  N_NODE_ID ,FileInputStream fis , java.io.File file) {
    Statement statement;
    try {
        //conn.close();
       // N_ACTIVITY_ID, V_NAME,N_SIZE, D_MODIFY,N_CATEGORY, N_NODE_ID ,O_OBJECT
        PreparedStatement pstmt = 
                              conn.prepareStatement("INSERT INTO PM_OBJECT_TABLE( " +
                              "N_ACTIVITY_ID, V_NAME,N_SIZE, D_MODIFY,N_CATEGORY, N_NODE_ID ,O_OBJECT) " +
                              " VALUES ( ? , ? , ? , ? , ? , ? ,empty_blob())");



InputStream bodyIn = fis;

                pstmt.setLong(1, N_ACTIVITY_ID);
                pstmt.setString(2, file.getName());
                pstmt.setLong(3, file.length());
                java.util.Date date = new java.util.Date(); 
                java.sql.Date sqlDate = new java.sql.Date(date.getTime()); 
                pstmt.setDate(4,sqlDate);
                pstmt.setInt(5, N_CATEGORY);
                pstmt.setLong(6, N_NODE_ID);
                //pstmt.setBinaryStream(7, bodyIn,(int) file.length());
                pstmt.executeUpdate();
                conn.commit();

    PreparedStatement stmt2 = conn.prepareStatement(" select O_OBJECT from PM_OBJECT_TABLE where N_ACTIVITY_ID = ? for update ");
    stmt2.setLong(1, N_ACTIVITY_ID);
    ResultSet rset = stmt2.executeQuery();

    FileInputStream inputFileInputStream    = new FileInputStream(file);
    rset.next();
    BLOB  image = ((OracleResultSet) rset).getBLOB("O_OBJECT");

    int bufferSize;
    byte[]  byteBuffer;
    int bytesRead = 0;
    int bytesWritten = 0;
    int totBytesRead = 0;
    int totBytesWritten = 0;

    bufferSize = image.getBufferSize();
    byteBuffer = new byte[bufferSize];

    OutputStream blobOutputStream = image.getBinaryOutputStream();

    while ((bytesRead = inputFileInputStream.read(byteBuffer)) != -1) {
      // After reading a buffer from the binary file, write the contents
      // of the buffer to the output stream using the write()
      // method.
        blobOutputStream.write(byteBuffer, 0, bytesRead);
        totBytesRead += bytesRead;
        totBytesWritten += bytesRead;
    }
  inputFileInputStream.close();
  blobOutputStream.close();

  conn.commit();
  rset.close();
  stmt2.close();

 String output =  "Wrote file " + file.getName() + " to BLOB column." +
                  totBytesRead + " bytes read." +
                  totBytesWritten + " bytes written.\n";
    return output;
} catch (Exception e) {
    e.printStackTrace();
    return "Wrote file " + file.getName() + " to BLOB column failed." ;
}
}


Use java.sql.PreparedStatement.setBinaryStream(int parameterIndex, InputStream x) -- 2 parameters, not 3.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜