Java EclipseLink:调用存储过程的参数数量或类型错误
我将EclipseLink用于一个涉及EJB3和Oracle存储过程的web项目。我们还处于起步阶段,所以我为测试设置了一个简单的程序,下面是签名:Java EclipseLink:调用存储过程的参数数量或类型错误,java,oracle,stored-procedures,jpa,eclipselink,Java,Oracle,Stored Procedures,Jpa,Eclipselink,我将EclipseLink用于一个涉及EJB3和Oracle存储过程的web项目。我们还处于起步阶段,所以我为测试设置了一个简单的程序,下面是签名: p_test.testProcedure(as_param in varchar2) 下面是我用来调用该过程的代码,类似于EclipseMedia上的Using Basic Query API文章: JpaEntityManager jem = (JpaEntityManager) em.getDelegate(); StoredProcedu
p_test.testProcedure(as_param in varchar2)
下面是我用来调用该过程的代码,类似于EclipseMedia上的Using Basic Query API文章:
JpaEntityManager jem = (JpaEntityManager) em.getDelegate();
StoredProcedureCall call = new StoredProcedureCall();
call.setProcedureName("p_test.testProcedure");
call.addNamedArgument("param", "param", String.class);
DataReadQuery query = new DataReadQuery();
query.setCall(call);
query.addArgument("param", String.class);
Vector<String> values = new Vector<String>();
values.add("test");
jem.getActiveSession().executeQuery(query, values);
我还尝试将调用参数类型设置为java.sql.Types.VARCHAR和none,但没有效果
有人知道我做错了什么吗?谢谢大家。看起来您在addNamedArgument方法中指定的procedureParameterName与存储过程中指定的不同,即“param”与“as_param”。尝试将逻辑更改为以下内容:
call.addNamedArgument("as_param", "param", String.class);
此方法将调用query.addParameter时使用的参数名与存储过程中定义的参数名进行映射。看起来您在addNamedArgument方法中指定的过程参数名与存储过程中指定的过程参数名不同,即“param”与“as_param”。尝试将逻辑更改为以下内容:
call.addNamedArgument("as_param", "param", String.class);
此方法将调用query.addParameter时使用的参数名称与存储过程中定义的参数名称进行映射。来自TopLink文档
addNamedArgument
public void addNamedArgument(java.lang.String procedureParameterName,
java.lang.String argumentFieldName)
PUBLIC:将参数定义为
存储过程和
要替换的字段/参数名称
为了它。过程参数名称为
过程参数的名称
预期。argumentFieldName是
要用于
转到程序。如果这些名字
相同(与正常情况相同)
可以使用
单参数
来自TopLink文档
addNamedArgument
public void addNamedArgument(java.lang.String procedureParameterName,
java.lang.String argumentFieldName)
PUBLIC:将参数定义为
存储过程和
要替换的字段/参数名称
为了它。过程参数名称为
过程参数的名称
预期。argumentFieldName是
要用于
转到程序。如果这些名字
相同(与正常情况相同)
可以使用
单参数
结合以上两个答案和我自己的智慧解决了这个问题 首先,我使用了#1建议的addNamedArgumentValue asu。 其次,我使用了#2建议的正确过程参数名称。 最后,我直接使用了
jem.executeNonSelectingCall(call)
,它成功了。(也不带OUT参数)
所以他们俩都得到了投票权 结合以上两个答案和我自己的智慧解决了这个问题 首先,我使用了#1建议的addNamedArgumentValue asu。 其次,我使用了#2建议的正确过程参数名称。 最后,我直接使用了
jem.executeNonSelectingCall(call)
,它成功了。(也不带OUT参数)
所以他们俩都得到了投票权 立即尝试:错误现在是
java.sql.SQLException:ORA-00900:无效的sql语句错误代码:0调用:BEGIN p_test.testProcedure(as_param=>?);结束;bind=>[test]Query:DataReadQuery()
您是否验证了存储过程是否正确执行,即直接从SQL*Plus或其他SQL客户端执行它?立即尝试:错误现在是java.SQL.SQLException:ORA-00900:无效SQL语句错误代码:0调用:开始p_test.testProcedure(as_param=>?);结束;bind=>[test]Query:DataReadQuery()
您是否验证了存储过程是否正确执行,即直接从SQL*Plus或其他SQL客户机执行它?这也在EclipseLink文档上。尝试过之后,我现在得到java.sql.SQLException:ORA-00900:invalid sql语句错误代码:0调用:BEGIN p_test.testProcedure(as_param=>?);结束;bind=>[test]Query:DataReadQuery()
,如下所示,但代码不同。这也适用于EclipseLink文档。尝试过之后,我现在得到java.sql.SQLException:ORA-00900:invalid sql语句错误代码:0调用:BEGIN p_test.testProcedure(as_param=>?);结束;bind=>[test]Query:DataReadQuery()
,如下所示,但代码不同。