3

テーブルの Oracle Blob フィールドに byte[] 配列を挿入しようとしている Java ストアド プロシージャがあります。

次のように準備済みステートメントを作成しますが、準備済みステートメントを実行するとランダムに失敗します。問題が pstmt.setBytes(4,content) から発生していることを絞り込みました。私が得るエラーは次のとおりです。

ORA-01460: 実装されていない、または不当な変換が要求されました。

private static void insertFile(Connection connOracle, int zipFileId, byte[] data, String filepath, String filename ) throws SQLException {

try {
    String QUERY = "INSERT INTO files(file_id, zip_file_id, filename, file_path, content) VALUES(SEQ_FILE_ID.nextval,?,?,?,?)";

    PreparedStatement pstmt = connOracle.prepareStatement(QUERY);

    pstmt.setInt(1,zipFileId);
    pstmt.setString(2, filename);
    pstmt.setString(3, filepath);
    pstmt.setBytes(4, data);

    System.out.println("INSERTING file_id " + filepath + ", " + filename + " INTO DATABASE");

    pstmt.execute();
    pstmt.close();
}
catch (SQLException e) {
    throw new SQLException(e.getMessage());  
}
4

2 に答える 2

5

私の記憶が正しければ、Oracle JDBC ドライバー (少なくとも古いもの - 使用しているバージョンを教えてくれませんでした) はサポートされていませんsetBytes()(またはgetBytes())。

私の経験では、使用setBinaryStream()ははるかに信頼性が高く安定しています。

InputStream in = new ByteArrayInputStream(data);
pstmt.setBinarySream(4, in, data.length);
于 2013-08-26T10:08:25.457 に答える
2

以下のコードを試してみてください。これでうまくいくはずです:-

Blob blobValue = new SerialBlob(data);
pstmt.setBlob(4, blobValue);
于 2011-10-17T17:45:14.117 に答える