java jdbc update BLOB

evgeniy

возникла проблема с обновлением blob-ов в Oracle.
пытаюсь сделать таким способом(вроде везде рекомендуется):
вытащить сначала blob с помощью select for update,
а потом его обновить.
Но на вызове select-а вылетает исключение
java.sql.SQLException: ORA-01002: выборка из последовательности.
почему jdbc ругается на select for update и как можно еще проапдейтить blob?
спасибо.

Hastya

SELECT FOR UPDATE нужен не для записи блоба, а для установления блокировок.
Каким конкретно кодом записывается блоб? Ошибка явно не в SELECTe.

evgeniy

сначала я пыталась сделать таким образом, как с любыми другими полями
statement = connection.prepareStatement("update table set CONTENT=? where NO=?");
statement.setBlob(1, blob);
statement.setBigDecimal(2, new BigDecimal(95794357;
statement.executeUpdate;, где blob сформировала по данным
но это ни к чему хорошему не привело.
Тогда я покапалась по форумам и узнала что перед тем как апдейтить blob нужно его вытащить сначала
statement = connection.prepareStatement("select CONTENT from table where NO=? FOR UPDATE");
statement.setBigDecimal(1, new BigDecimal(95794357;
statement.executeQuery; а потом загружить своими данным и сделать update
Но и тут все проблемно

Hastya

Напиши полностью код по загрузке блоба и в каком конкретно месте возникает исключение.

evgeniy

1.statement = connection.prepareStatement("select CONTENT from doc$structures where NO=? FOR UPDATE");
2.statement.setBigDecimal(1, tagContent.getNo;
3.statement.executeQuery;
4.ResultSet rs = statement.getResultSet;
5. oracle.sql.BLOB blob = null;
6. if (rs.next {
7 blob = oracle.jdbc.driver.OracleResultSet) rs).getBLOB(1);
8 blob.putBytes(1, tagContent.getData;
9 }
10 rs.close;
11 statement.close;
12.statement = connection.prepareStatement("update doc$structures set CONTENT=? where NO=?");
13. statement.setBlob(1, blob);
14.statement.setBigDecimal(2, tagContent.getNo;
15 statement.executeUpdate;
16.statement.close;
Исключение вылетает уже в 3 строке.
java.sql.SQLException: ORA-01002: выборка из последовательности

Hastya

попробуй убрать FOR UPDATE и лишний вызов getResultSet

Svyatogor

Исключение вылетает уже в 3 строке.
java.sql.SQLException: ORA-01002: выборка из последовательности
Автокоммит на соединении включен? Нужно выключить, conn.setAutoCommit(false).
ORA-01002: fetch out of sequence
Cause: ...
2) If the cursor has been opened with the FOR UPDATE clause, fetching after a COMMIT has been issued will return the error.
...
Action:
2) Do not issue a COMMIT inside a fetch loop for a cursor that has been opened FOR UPDATE.

evgeniy

спасибо всем за содействие. если кому интересно то вопрос решился так:
на pl/sql написана фукнция по обновлению bloba
create or replace function updateBLOB(pno number, pBlob blob)
return number is
xBLOB_rowid rowid;
ret number := 0;
cursor cIsBlob is
select rowid from doc$structures where no = pNo;
begin
— check BLOB
open cIsBlob;
fetch cIsBlob
into xBLOB_rowid;
close cIsBlob;
— update BLOB
if xBLOB_rowid is not null then
update doc$structures set content = pBlob where rowid = xBLOB_rowid;
ret := 1;
end if;
return ret;
end;
и вызвана таким образом:
databaseCall.setSQL("{ ? = call updateBLOB(:pNo, Blob) }");
databaseCall.createParametersFromSQL;
databaseCall.setParameterMode("pBlob", ParameterMetaData.parameterModeIn);
databaseCall.setParameterOracleType("pBlob", OracleTypes.BLOB);
databaseCall.getParameterRow.setBigDecimal("pNo", new BigDecimal(1111111;
BLOB blob = BLOB.createTemporary(connection, false, BLOB.DURATION_SESSION);
blob.open(BLOB.MODE_READWRITE);
OutputStream out = blob.getBinaryOutputStream;
out.write(bytes);
out.flush;
out.close;
databaseCall.getParameterRow.setBlob("pBlob", blob);
databaseCall.execute;
Без всяких премудростей
Оставить комментарий
Имя или ник:
Комментарий: