Instancja Clob jest powiązana z „oracleConnection”, której używasz do jej utworzenia, a SimpleJDBCCall używa innego połączenia do wywołania bazy danych. Istnieją dwie niezależne sesje z punktu widzenia DB i to jest powód, dla którego clob nie istnieje w sesji używanej przez SimpleJDBCCall.
Połączenie, którego używa SimpleJDBCCall, musi być używane do tworzenia Cloba.
Udało mi się rozwiązać podobny problem, implementując SQLData i wyodrębniając bieżące połączenie:
Map<String, Object> values = new HashMap<>();
values.put("IN_bean_type", new MyBean());
simpleJdbcCallOperations.execute(values);
MyBean:
class MyBean implements SQLData {
...
@Override
public void writeSQL(SQLOutput stream) throws SQLException {
...
Clob clob = ((OracleSQLOutput)stream).getSTRUCT().getJavaSqlConnection().createClob(); //hack to get the current connection
clob.setString(1, "stringValue");
stream.writeClob(clob);
...
}
...
}