Я должен вызвать хранимую процедуру pl / sql из Java. Хранимая процедура имеет входные и выходные параметры, которые определяются пользователем как объекты.
Я определил классы, которые реализуют класс SQLData для отображения объекта базы данных в объект Java.
Это мой код для вызова хранимой процедуры
private String procedure = "{call READ_METADATA(?,?,?,?)}";
Connection conn = DriverManager.getConnection(dbConnectionUrl, username, password);
CallableStatement cstmt = conn.prepareCall(procedure);
Map metaDataMap = conn.getTypeMap();
metaDataMap.put("METADATA", Class.forName("mypackage.TMetaData"));
conn.setTypeMap(metaDataMap);
Map resultMap = conn.getTypeMap();
resultMap.put("RESULT", Class.forName("mypackage.TResult"));
conn.setTypeMap(resultMap);
Object[] callerArray = new Object[4];
callerArray[0] = "";
callerArray[1] = "";
callerArray[2] = codeApplication;
callerArray[3] = codeFacility;
Struct struct = conn.createStruct("CALLER", callerArray);
cstmt.setObject(1, struct);
cstmt.setString(2, fdnSequenceId.toString());
cstmt.registerOutParameter(3, OracleTypes.STRUCT, "METADATA");
cstmt.registerOutParameter(4, OracleTypes.STRUCT, "RESULT");
cstmt.executeUpdate();
Чем я получаю данные из хранимой процедуры таким образом
TMetaData metadati = (TMetaData)cstmt.getObject(3, metaDataMap);
TResult result = (TResult)cstmt.getObject(4, resultMap);
Это определение хранимой процедуры
CREATE OR REPLACE PROCEDURE READ_METADATA
(
param_caller IN CALLER,
param_sequence_id IN VARCHAR2,
param_metadata OUT METATADA,
param_result OUT RESULT
);
Проблема в том, что объект METADATA содержит значение NULL, а объект результата содержит '???' во всех полях.
Если я вызываю хранимую процедуру из SQL Developer, она работает.