我负责一项我认为应该简单的任务,但是在我遇到麻烦之前我从未这样做过。我已成功使用EclipseLink创建了一个EJB 3项目,该项目将从Oracle数据库调用许多存储过程。我已经正确配置了数据源,我可以连接并执行简单的存储过程和函数(没有参数并返回游标);但是,我目前无法使用参数执行存储过程。
我使用EclipseLink wiki作为参考http://wiki.eclipse.org/Using_Basic_Query_API_(ELUG)。
代码是:
StoredProcedureCall call = new StoredProcedureCall();
call.setProcedureName("p_environment.startSession");
List<String[]> args = new ArrayList<String[]>();
args.add(new String[] { "user", "ae01403" });
args.add(new String[] { "application", "app_code" });
args.add(new String[] { "locale", "it_IT" });
for (String[] pair : args) {
call.addNamedArgumentValue(pair[0], pair[1]);
}
DataReadQuery query = new DataReadQuery(call);
for (String[] pair : args) {
query.addArgument(pair[0]);
}
基于数据库文档,因为我无权访问数据库本身,所以该过程采用指定名称的3个VARCHAR IN参数。然后我在活动会话上调用executeQuery方法,但收到“错误的类型或参数个数”错误。我究竟做错了什么?任何帮助表示赞赏。
编辑:根据文档,存储过程签名是:
p_environment.startSession(as_user IN VARCHAR2,
as_application IN VARCHAR2,
as_locale IN VARCHAR2);
非常感谢!
答案 0 :(得分:0)
在您的代码中,call.addNamedArgumentValue(pair[0], pair[1]);
听起来很奇怪。
你不需要这样做吗?
call.addNamedArgument(procedureParameterName, argumentFieldName, argumentType);
它支持存储过程参数与您要使用的args之间的映射。
例如,对你来说,它给出了:
call.addNamedArgument(procedureUserParameterName, "user", String.class);
call.addNamedArgument(procedureUserParameterName, "application", String.class);
call.addNamedArgument(procedureUserParameterName, "locale", String.class);
你保留这个:
DataReadQuery query = new DataReadQuery(call);
for (String[] pair : args) {
query.addArgument(pair[0]);
}
然后调用您的存储过程:
Session session = jpaEntityManager.getActiveSession();
List args = new ArrayList();
args.add(“ae01403”);
args.add(“app_code”);
args.add(“it_IT”);
List results = (List) session.executeQuery(query, args);