java - "SQLException: Missing IN or OUT parameter"尽管已明确注册

标签 java spring jpa stored-procedures entitymanager

我有一个 Spring Boot 应用程序,使用 JPA 和自定义实现来调用存储过程。问题是,在执行调用时,我收到“Missing IN or OUT parameter at index::7”。

实现如下所示:

public class DbLogImpl implements DbLogCustom {
    @PersistenceContext
    private EntityManager em;

    @Override
    public Long callInsertLog(Long firstId, Long secondId, Long process, Long subProcess, Long logLevelId, String message, String stacktrace) {

        Long logId = null;

        StoredProcedureQuery proc = em.createStoredProcedureQuery("logging_pk.insert_log");
        proc.registerStoredProcedureParameter(0, Long.class, IN);
        proc.registerStoredProcedureParameter(1, Long.class, IN);
        proc.registerStoredProcedureParameter(2, Long.class, IN);
        proc.registerStoredProcedureParameter(3, Long.class, IN);
        proc.registerStoredProcedureParameter(4, Long.class, IN);
        proc.registerStoredProcedureParameter(5, String.class, IN);
        proc.registerStoredProcedureParameter(6, String.class, IN);
        proc.setParameter(0, firstId);
        proc.setParameter(1, secondId);
        proc.setParameter(2, process);
        proc.setParameter(3, subProcess);
        proc.setParameter(4, logLevelId);
        proc.setParameter(5, message);
        proc.setParameter(6, stacktrace);
        proc.registerStoredProcedureParameter(7, Long.class, OUT);
        proc.execute();

        logId = (Long) proc.getOutputParameterValue(7);

        return logId;
    }
}

我的包看起来像这样:

CREATE OR REPLACE PACKAGE logging_pk AS

    PROCEDURE insert_log (
        i_first_id                      NUMERIC,
        i_second_id                     NUMERIC,
        i_process                       NUMERIC,
        i_sub_process                   NUMERIC,
        i_log_level_id                  NUMERIC,
        i_message                       VARCHAR2,
        i_stacktrace                    VARCHAR2,
        o_log_id                    OUT NUMERIC
    );

END;

如果这是我唯一的程序,我很可能会承认失败并尝试其他方法。 (我已经设法让它与 native 查询一起使用,但没有实际获取输出参数值。)

但是,我有另一个存储过程调用,其设置与此完全相同,并且工作正常。唯一的区别是参数的名称和数量(工作参数有 3 个输入和 1 个输出,输出也是最后一个)。

我无法理解为什么一个工作正常,而另一个则不然。

编辑: 由于我在发布这个问题之前就发现了问题,所以我决定省略很多与问题无关的代码,但我将把它留在这里供其他人查找。

最佳答案

在写这个问题的时候我突然有了一个想法。

事实证明,解决方案相当简单。

显然,将 String 参数设置为 null 是不被接受的。通过引入 null 检查并将 null 字符串(本例中为 stacktrace 参数)设置为空字符串解决了问题。

将其留在这里以防其他人遇到此问题。

关于java - "SQLException: Missing IN or OUT parameter"尽管已明确注册,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43380591/

相关文章:

java - ArangoDB 在没有 new 的情况下创建/更新

java - 多个 Tomcat 实例配置

java - 将旧循环转换为 Java8 循环

Spring security DefaultHttpFirewall - requestURI 不能包含编码的斜杠

java - hibernate/JPA : Remove from multiple parents when child is deleted

java - 如何从存储库中获取一个值,并将该值与表的两个字段进行比较

java - 如何将多条数据保存为一个包

java - 如何为mybatis框架生成的mapper类创建Aspect?

java - 如何从jdbc模板查询中提取hashmap对象

java - 使用复合主键更新 JPA 实体会导致重复输入错误