"SQLException: Missing IN or OUT parameter" 尽管已明确注册
"SQLException: Missing IN or OUT parameter" despite being explicitly registered
我有一个 spring 启动应用程序,它使用 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;
如果这是我唯一的程序,我很可能会认输并尝试另一种方法。
(我已经设法让它与本机查询一起工作,但实际上并没有获得输出参数值。)
但是,我有另一个存储过程调用,它的设置与这个完全相同,并且工作正常。唯一的区别是参数的名称和数量(工作的有 3 个输入和 1 个输出,输出也是最后一个)。
我不明白为什么一个工作正常而另一个工作不正常。
编辑:
由于我在发布这个问题之前发现了问题,所以我决定省略很多与问题无关的代码,但我会把它留在这里供其他人查找。
在写这个问题的时候突然灵机一动
事实证明,解决方案相当简单。
显然,不接受将 String 参数设置为 null。通过引入空检查并将空字符串(在本例中为 stacktrace 参数)设置为空字符串来解决问题。
把这个留在这里以防其他人遇到这个问题。
我有一个 spring 启动应用程序,它使用 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;
如果这是我唯一的程序,我很可能会认输并尝试另一种方法。 (我已经设法让它与本机查询一起工作,但实际上并没有获得输出参数值。)
但是,我有另一个存储过程调用,它的设置与这个完全相同,并且工作正常。唯一的区别是参数的名称和数量(工作的有 3 个输入和 1 个输出,输出也是最后一个)。
我不明白为什么一个工作正常而另一个工作不正常。
编辑: 由于我在发布这个问题之前发现了问题,所以我决定省略很多与问题无关的代码,但我会把它留在这里供其他人查找。
在写这个问题的时候突然灵机一动
事实证明,解决方案相当简单。
显然,不接受将 String 参数设置为 null。通过引入空检查并将空字符串(在本例中为 stacktrace 参数)设置为空字符串来解决问题。
把这个留在这里以防其他人遇到这个问题。