繁体   English   中英

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

[英]EclipseLink: Wrong number or types of arguments calling a Stored Procedure

我正在将EclipseLink用于涉及EJB 3和Oracle存储过程的Web项目。 我们仍处于起步阶段,因此我为测试设置了一个简单的过程,这是签名:

p_test.testProcedure(as_param in varchar2)

这是我用来调用该过程的代码,类似于Eclipsepedia上的《使用基本查询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);

我不断收到此错误:

Exception [EclipseLink-4002] (Eclipse Persistence Services - 2.1.1.v20100817-r8050):
org.eclipse.persistence.exceptions.DatabaseException Internal Exception: 
java.sql.SQLException: ORA-06550: line 1, column 7: PLS-00306: wrong number or types of 
arguments in call to 'TESTPROCEDURE' ORA-06550: line 1, column 7: PL/SQL: Statement
ignored Error Code: 6550 Call: BEGIN p_test.testProcedure(param=>?); END; bind => [test] Query: DataReadQuery()

我也尝试将调用参数类型设置为java.sql.Types.VARCHAR,并且完全没有设置,这毫无作用。

有人知道我在做什么错吗? 感谢大家。

似乎您在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:定义存储过程的参数和要替换的字段/参数名称。 procedureParameterName是所需过程参数的名称。 argumentsFieldName是用于传递给过程的字段或参数名称。 如果这些名称相同(通常相同),则可以使用单个参数调用此方法。

public void addNamedArgumentValue(java.lang.String procedureParameterName,
                                  java.lang.Object argumentValue)

 call.addNamedArgumentValue("param",(Object)values );

通过结合以上两个答案和我自己的智慧来解决。

首先,我使用了#1建议的addNamedArgumentValue asu。 其次,我使用了#2建议的正确的过程参数名称。 最后,我直接使用了jem.executeNonSelectingCall(call) ,它可以正常工作。 (还有OUT参数)。

这样他们俩都可以投票了!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM