【问题标题】:how to call oracle stored procedure in jpa2.0 which returns integer as out variable如何在jpa2.0中调用oracle存储过程,将整数作为输出变量返回
【发布时间】:2014-11-27 05:32:05
【问题描述】:

我写了一个存储过程,它会返回整数值。但我无法在 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;

【问题讨论】:

    标签: oracle jpa


    【解决方案1】:

    看起来类似于这个answer

    我尝试过的选项:

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

      Query q = entitymanager.createNativeQuery("{call sample_procedure(?,?)}").setParameter(1, inparam).setParameter(2, outparam);

      q.executeUpdate();

    它没有工作。没有将输出返回给 java 类。

    1. 试过这个:

      Query q = entitymanager.createNativeQuery("{call sample_procedure(?,?)}", Integer.class).setParameter(1, inparam).setParameter(2, outparam);

      q.executeUpdate();

    它也没有工作。没有将输出返回给 java 类。

    1. 也试过了:

      Query q = entitymanager.createNativeQuery("{call sample_procedure(?,?)}").setParameter(1, inparam).setParameter(2, outparam);

      q.getSingleResult();

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

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

    【讨论】:

    • 是的,我同意你的说法。在 jpa 2.0 中这是不可能的,我在我的代码中处理了逻辑。
    【解决方案2】:

    我在过程中有一些逻辑,在循环内部我正在增加计数。

    首先,在您给定的用例中,count 必须声明为 INOUT(输入和输出)。

    PROCEDURE sample_procedure(
        id IN VARCHAR,
        count INOUT NUMBER)
    

    然后:

    对于 JPA OUT 或 INOUT 参数取回值。因此,如果您需要继续使用该版本,您可能会遇到困难。


    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);
    

    未经测试。当心错别字!

    【讨论】:

    • 谢谢,我尝试了第一种方法(JPA(2) 与请求的类型类 java.lang. lang.Integer”。我不得不使用 count 变量作为对象类型,因为它给出了编译错误。
    • @MadhusudhanReddy 我知道 - 或者至少我有感觉 - 打字时有一些错字,但我无法找到它。当然,您需要getParameterValue,而不是getParameter。对不起。我已经相应地修正了我的答案。
    猜你喜欢
    • 1970-01-01
    • 2019-07-12
    • 2022-08-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-24
    • 2012-08-11
    • 2011-03-09
    相关资源
    最近更新 更多