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

Posted

技术标签:

【中文标题】EclipseLink - Oracle 存储过程调用新手问题【英文标题】:EclipseLink - Oracle Stored Procedure call newbie problem 【发布时间】:2010-12-29 15:39:40 【问题描述】:

我负责一项我认为应该很简单的任务,但在遇到麻烦之前我从未做过。我已经使用 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】:

在您的代码中,call.addNamedArgumentValue(pair[0], pair[1]); 听起来很奇怪。

您不需要这样做吗?

call.addNamedArgument(procedureParameterName, argumentFieldName, argumentType);

它启用了存储过程参数和要使用的参数之间的映射。

例如,对你来说,它给出:

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

【讨论】:

谢谢,但不,不走运。我认为 call.addNamedArgumentValue(pair[0], pair[1]);与将参数列表作为参数传递给 session.executeQuery() 的作用相同,将值绑定到参数。未指定时,类型默认为字符串,并且无论如何我打算对过程参数名称和参数字段名称使用相同的名称。错误和生成的代码也是一样的......我很茫然。我编辑了问题以包含存储过程签名。

以上是关于EclipseLink - Oracle 存储过程调用新手问题的主要内容,如果未能解决你的问题,请参考以下文章

使用 EclipseLink 在 Oracle 上执行查询时出现奇怪的行为

Up-to-date cache with EclipseLink and Oracle

JPA - EclipseLink - 如何更改默认模式

使用 EclipseLink JPA 将 XML 类型存储到 PostgreSQL

带有容器管理事务的 EclipseLink - persist() 不提交

使用 Sniffy 指定的 Oracle URL 无效