Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java EclipseLink-Oracle存储过程调用新手问题_Java_Oracle_Stored Procedures_Eclipselink - Fatal编程技术网

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

Java EclipseLink-Oracle存储过程调用新手问题,java,oracle,stored-procedures,eclipselink,Java,Oracle,Stored Procedures,Eclipselink,我负责一项我认为应该很简单的任务,但因为我以前从未做过,所以我遇到了一些麻烦。我已经成功地使用EclipseLink创建了一个EJB3项目,它将从Oracle数据库中调用许多存储过程。我已经正确配置了数据源,我可以连接和执行简单的存储过程和函数,而不需要参数和返回游标;但是,我目前无法使用参数执行存储过程 我正在使用EclipseLink维基作为参考 代码是: StoredProcedureCall call = new StoredProcedureCall(); call.setProced

我负责一项我认为应该很简单的任务,但因为我以前从未做过,所以我遇到了一些麻烦。我已经成功地使用EclipseLink创建了一个EJB3项目,它将从Oracle数据库中调用许多存储过程。我已经正确配置了数据源,我可以连接和执行简单的存储过程和函数,而不需要参数和返回游标;但是,我目前无法使用参数执行存储过程

我正在使用EclipseLink维基作为参考

代码是:

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]);
}
非常感谢

在代码中,调用.addNamedArgumentValuepair[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.addNamedArgumentValuepair[0],pair[1];执行与将参数列表作为参数传递给session.executeQuery相同的操作,将值绑定到参数。未指定时,Type默认为String,并且我打算对过程参数名和参数字段名使用相同的名称。错误和生成的代码也是相同的。。。我不知所措。我编辑了这个问题以包含存储过程签名。
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);