Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/369.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:调用存储过程的参数数量或类型错误_Java_Oracle_Stored Procedures_Jpa_Eclipselink - Fatal编程技术网

Java EclipseLink:调用存储过程的参数数量或类型错误

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

我将EclipseLink用于一个涉及EJB3和Oracle存储过程的web项目。我们还处于起步阶段,所以我为测试设置了一个简单的程序,下面是签名:

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()
,如下所示,但代码不同。