我需要使用EclipseLink(2.3.1.v20111018-r10243)调用Oracle存储过程。该过程有IN和OUT参数,我需要读取OUT参数。
我发现this example并且我的代码几乎是示例的副本,但是它没有从API接收List,而是抛出异常,因为值是值的整数" 1& #34;,我无法弄清楚原因。
正确调用该过程,IN参数正常,但代码无法读取响应"应该"根据例子是一个列表。
import java.util.ArrayList;
import java.util.List;
import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import org.eclipse.persistence.jpa.JpaEntityManager;
import org.eclipse.persistence.platform.database.jdbc.JDBCTypes;
import org.eclipse.persistence.platform.database.oracle.plsql.OraclePLSQLTypes;
import org.eclipse.persistence.platform.database.oracle.plsql.PLSQLStoredProcedureCall;
import org.eclipse.persistence.queries.DataModifyQuery;
import org.eclipse.persistence.sessions.DatabaseRecord;
import org.eclipse.persistence.sessions.Session;
public class ProcedureCall {
@PersistenceContext
private EntityManager em;
public String execute(Long parameter) throws Exception {
PLSQLStoredProcedureCall call = new PLSQLStoredProcedureCall();
call.setProcedureName("two_arg_in_out");
call.addNamedOutputArgument("X", OraclePLSQLTypes.BinaryInteger);
call.addNamedArgument("Y", JDBCTypes.VARCHAR_TYPE, 40);
DataModifyQuery query = new DataModifyQuery();
query.setCall(call);
query.addArgument("Y");
List queryArgs = new ArrayList();
queryArgs.add(parameter);
Session session = ((JpaEntityManager) em.getDelegate()).getActiveSession();
Object obj = session.executeQuery(query, queryArgs);
// The system prints "Return: 1"
System.out.println("Return: " + obj);
List results = (List) obj; // Here is where exception happens
DatabaseRecord record = (DatabaseRecord) results.get(0);
String y = (String) record.get("X");
return "done";
}
}
系统抛出以下异常:
Caused by: java.lang.ClassCastException: java.lang.Integer cannot be cast to java.util.List
这是我正在使用的示例中的过程:
PROCEDURE two_arg_in_out(x OUT BINARY_INTEGER, y IN VARCHAR) AS
BEGIN
x := 33;
END;
答案 0 :(得分:1)
这看起来类似于此处显示的示例:https://wiki.eclipse.org/EclipseLink/Examples/JPA/nonJDBCArgsToStoredProcedures#Handling_IN_and_OUT_arguments
不同之处在于您使用围绕JDBC的executeUpdate设计的DataModifyQuery来执行查询,因此返回int而不是结果集。您将需要使用DataReadQuery来获取结果。