では、行きましょう...
ストアド プロシージャ (PL/SQL) を呼び出そうとしていますが、パラメータの 1 つが BLOB ですが、OracleCallableStatement を実行すると次のエラーが発生します。
java.sql.SQLException: データ サイズがこの型の最大サイズを超えています
それはああ、とてもイライラします..
私は次のことをしようとしましたが、失敗しました...
oracleCallableStatement.setBinaryStream(3, new ByteArrayInputStream(someByteArray), someByteArray.length);
次の場合と同じエラーが発生します。
oracleCallableStatement.setBytes(3, someByteArray);
次のようなWebページを読んだので、Oracleドライバーも変更しました。
http://www.coderanch.com/t/457770/JDBC/databases/java-sql-sqlexception-data-size
バグがあるとのことで、ojdbc5.jar に更新しました。
しかし、問題は永続的です
DB は Oracle 11g です JavaEE は Glassfish 2.1 で実行されている 1.5 です
まあ、それだけだと思います。私の someByteArray は 4Gb を超えていません! 長さは 38678 です
編集:実行前に例外が発生しています..OracleCallableStatementの属性を設定すると発生します
スタック トレースの一部:
at oracle.jdbc.dbaccess.DBError.throwSqlException(DBError.java:134)
at oracle.jdbc.dbaccess.DBError.throwSqlException(DBError.java:179)
at oracle.jdbc.ttc7.TTCItem.setArrayData(TTCItem.java:103)
at oracle.jdbc.dbaccess.DBDataSetImpl.setBytesBindItem(DBDataSetImpl.java:2484)
at oracle.jdbc.driver.OraclePreparedStatement.setItem(OraclePreparedStatement.java:1224)
at oracle.jdbc.driver.OraclePreparedStatement.setBinaryStream(OraclePreparedStatement.java:2710)
編集
それで、こんにちは、これをここに置きます...私が間違っている場合は教えてください。削除します...
someByteArray は、 someString.toByteArray() から取得した配列でした
その文字列は、Base64 でエンコードされた (編集: jpeg と言うために使用される) PNG 画像の表現を保持していました...
そのため、sun.misc.BASE64Decoder のメソッドを使用して、someString から someByteArray を取得しました...次に使用しました
oracleCallableStatement.setBinaryStream(3, new ByteArrayInputStream(someByteArray), someByteArray.length);
そして、それは魅力のように機能しました..
BUUUT... sun.misc のクラスの使用は推奨されません。詳細については、こちらをお読みください。
byte[] を取得するための作業 sun.misc.BASE64Encoder/Decoder
しかし!!!
それは、最初のバイト配列をパラメーターに入れることができなかった理由の謎と、不可解な例外「java.sql.SQLException: データサイズがこの型の最大サイズよりも大きい」の謎を解決しません...
編集:
このエラーが再び発生しました...今回はすべて問題ありませんでした.base64を正しくデコードしていましたが、「java.sql.SQLException:この型の最大サイズよりも大きいデータサイズ」が返され続けました...
編集:
それはドライバーでした。サーバーとアプリで変更し、再デプロイしたところ、すべて正常に機能しました...