EclipseLink - Oracle存储过程调用新手问题

时间:2010-12-29 15:39:40

标签: java oracle stored-procedures eclipselink

我负责一项我认为应该简单的任务,但是在我遇到麻烦之前我从未这样做过。我已成功使用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);

非常感谢!

1 个答案:

答案 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);