我必须从Java调用pl / sql存储过程。该存储过程具有输入和输出参数,这些参数由用户定义为对象。 我定义了实现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调用存储过程,它将起作用。