如何在jpa2.0中调用oracle存储过程,它返回整数作为out变量

时间:2014-11-27 05:32:05

标签: oracle jpa

我编写了一个存储过程,它将返回整数值。但我无法得到jpa的计数。任何人都可以建议我调用存储过程的方法,并使用jpa将返回值转换为java中的某个变量。

int count = 0;
String id = "m123"

count = getEm().createNativeQuery("call sample_procedure(?,?)")
                    .setParameter(1, id)
                    .setParameter(2, count)
                    .executeUpdate();

存储过程:我在程序中有一些逻辑,内部循环我正在递增计数。

    create or replace
PROCEDURE sample_procedure(
    id IN VARCHAR,
    count OUT NUMBER)
IS
  ........
BEGIN
.....
 LOOP
---------
 count := count + 1;

2 个答案:

答案 0 :(得分:0)

  

我在程序和内部循环中有一些逻辑我正在递增计数。

首先,在给定用例的情况下,count必须声明INOUT(输入和输出)。

PROCEDURE sample_procedure(
    id IN VARCHAR,
    count INOUT NUMBER)

然后:

对于JPA< 2.1不支持从OUTINOUT参数中获取值。所以,如果你需要继续使用该版本,你可能会陷入困境。


JPA> = 2.1明确支持使用EntityManager.html.createStoredProcedureQuery方法调用存储过程:

count = getEm().createStoredProcedureQuery("sample_procedure")
               .registerStoredProcedureParameter(1, String.class, ParameterMode.IN)
               .registerStoredProcedureParameter(2, Integer.class, ParameterMode.INOUT)
               .setParameter(1, id)
               .setParameter(2, count);

storedProcedure.execute();

int count = (Integer)storedProcedure.getOutputParameterValue(2);

<子>未测试。小心拼写错误!

答案 1 :(得分:0)

与此answer

类似

我尝试的选项:

  1. 在调用语句之前尝试使用花括号。

    查询q = entitymanager.createNativeQuery(“{sample sample_procedure(?,?)}”)。setParameter(1,inparam).setParameter(2,outparam);

    q.executeUpdate();

  2. 它不起作用。没有将输出返回给java类。

    1. 试过这个:

      查询q = entitymanager.createNativeQuery(“{sample sample_procedure(?,?)}”,Integer.class).setParameter(1,inparam).setParameter(2,outparam);

      q.executeUpdate();

    2. 它也没用。没有将输出返回给java类。

      1. 也试过这个:

        查询q = entitymanager.createNativeQuery(“{sample sample_procedure(?,?)}”)。setParameter(1,inparam).setParameter(2,outparam);

        q.getSingleResult();

      2. 这也引发了一个异常:无法对选择查询执行更新或删除操作:“{call sample_procedure(?,?)}”。

        我认为不可能像上面提到的答案链接中的 Sean Patrick Floyd 所提到的那样。(注意:我没有这本书:))如果你需要处理你的out参数,如果这是你需要它的原因,你需要逻辑地处理它。似乎在jpa2.0中无法实现