Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

simpleJdbcCall chamando o procedimento Pl/SQL -- ORA-22922 valor LOB inexistente


A instância Clob está vinculada ao 'oracleConnection' que você usa para criá-la e o SimpleJDBCCall usa outra conexão para a chamada de banco de dados. Existem duas sessões independentes do ponto de vista do banco de dados e essa é a razão pela qual o clob não existe na sessão usada pelo SimpleJDBCCall.

A conexão que o SimpleJDBCCall usa deve ser usada para a criação do Clob.

Consegui resolver um problema semelhante implementando SQLData e extraindo a conexão atual:
Map<String, Object> values = new HashMap<>();
values.put("IN_bean_type", new MyBean());
simpleJdbcCallOperations.execute(values);

MeuBean:
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);
        ...
    }
    ...
}