从EclipseLink PLSQLStoredProcedureCall读取OUT参数时出现ClassCastException

时间:2015-09-29 21:18:40

标签: java oracle stored-procedures eclipselink

我需要使用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;

1 个答案:

答案 0 :(得分:1)

这看起来类似于此处显示的示例:https://wiki.eclipse.org/EclipseLink/Examples/JPA/nonJDBCArgsToStoredProcedures#Handling_IN_and_OUT_arguments

不同之处在于您使用围绕JDBC的executeUpdate设计的DataModifyQuery来执行查询,因此返回int而不是结果集。您将需要使用DataReadQuery来获取结果。