Java-使用用户定义的输入和输出参数从plsql存储过程中检索数据

时间:2018-11-16 13:12:01

标签: java oracle stored-procedures plsql

我必须从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调用存储过程,它将起作用。

0 个答案:

没有答案