【问题标题】:Call oracle function in Spring JPA在 Spring JPA 中调用 oracle 函数
【发布时间】:2019-06-05 07:59:44
【问题描述】:

我有这个

DECLARE
  c number;
BEGIN
  c := get_next_unlocked_id();
  DBMS_OUTPUT.put_line('id: ' || c);
END;

此查询打印函数结果。但我需要在我的 Spring 数据 JPA 存储库或 entitiManager 中返回这个结果。

我试试这个:

@Override
    public Long getOld() {
        Long id = (Long) em.createNativeQuery("SELECT get_next_unlocked_id() FROM DUAL").getSingleResult();
        return id;
    } 

但我得到错误:

2019-01-10 15: 28: 25.768 ERROR 6724 --- [pool-1-thread-2] o.h.engine.jdbc.spi.SqlExceptionHelper: ORA-14551: the DML operation cannot be performed inside the request
ORA-06512: on "MY.GET_NEXT_UNLOCKED_ID", line 8

【问题讨论】:

    标签: java oracle function spring-data-jpa entitymanager


    【解决方案1】:

    您在 select (get_next_unlocked_id) 中调用的函数尝试进行数据修改,您尝试的方式不允许这样做。

    问题是您的解决方案似乎是“查询”,而实际上它正在修改数据。我假设你的函数增加了一些计数器或更新了一些东西?您收到的 ORA 错误代码非常具有描述性,这里是 longer explanation

    解决方案是使用 Java 中的CallableStatements

    【讨论】:

    • 我正在尝试为每个线程获取锁定行。这个功能是 SO 向我建议的。这是一个相关的问题,也许您也可以提供帮助? stackoverflow.com/q/54125380/4781349
    • 很抱歉,我不会参与这个问题。这是一个直截了当的问题,但在另一个问题中,您正在寻求解决方案的帮助,我认为这根本不是一个好的方向。我不知道该怎么做,因为我以前不会(也没有做过)。为此,您将需要其他人。在您的位置,我将决定将复杂性放在哪里:应用程序或数据库,并将其保留在那里。混合这么多会带来很多麻烦。
    猜你喜欢
    • 2018-02-02
    • 2011-08-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-10
    • 2021-03-13
    • 1970-01-01
    相关资源
    最近更新 更多