gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 11:06:56 24 4
gpt4 key购买 nike

我需要使用 EclipseLink (2.3.1.v20111018-r10243) 调用 Oracle 存储过程。该程序有IN和OUT参数,我需要读取OUT参数。

我找到了this example我的代码几乎是该示例的副本,但它不是从 API 接收列表,而是抛出异常,因为该值是值“1”的整数,我不明白为什么。

该过程被正确调用,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;

最佳答案

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

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

关于java - 从 EclipseLink PLSQLStoredProcedureCall 读取 OUT 参数时出现 ClassCastException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32853944/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com