【问题标题】:SQL state [99999]; error code [17004]; Type de colonne non valide: 1111SQL 状态 [99999];错误代码 [17004];类型 de冒号无效:1111
【发布时间】:2018-06-28 12:40:26
【问题描述】:

我有这个对 PL/SQL 函数的调用

FUNCTION F_IsDemandeDeLitFromHosp(i_NoMvtHosp   IN MVTHOSP.NOMVTHOSP%TYPE  
)RETURN BOOLEAN
IS
   v_Found NUMBER := 0;
BEGIN
   BEGIN
      SELECT COUNT(1) INTO v_Found
        FROM ICSF.T_DEMANDE_LIT D, MVTUS U, MVTHOSP H
       WHERE H.NOMVTHOSP = i_NoMvtHosp
         AND H.NOMVTHOSP = U.NOMVTHOSP
         AND U.NOMVTUS = D.NOMVTUS
         AND U.RANG <> '0000000000'
         AND H.RANG = '0000100000'
         AND NVL (D.ETAT, ' ') <> 'X'
         AND NVL (U.ETAT, ' ') <> 'X'
         AND NVL (H.ETAT, ' ') <> 'X'
         AND ROWNUM = 1;
   EXCEPTION
      WHEN OTHERS THEN
         RETURN FALSE;
   END;
   IF v_Found > 0 THEN
      RETURN TRUE;
   ELSE
      RETURN FALSE;
   END IF;
END F_IsDemandeDeLitFromHosp;

我尝试编写一个服务来获取布尔值作为回报。 i_NoMvtHospCHAR(10 BYTE),这是我的函数的调用:

@Override
public DemandeDeLitFromHospit isDemandeDelitFromHosp(String noMvtHosp) {
    final ProcedureRequest request = new ProcedureRequest(PK.GET_IS_DEMANDE_DE_LIT_FROM_HOSP.getPackageName(), PK.GET_IS_DEMANDE_DE_LIT_FROM_HOSP.getMethodeName());
    request.addInParam("i_NoMvtHosp", noMvtHosp);
    DemandeDeLitFromHospit demande = new DemandeDeLitFromHospit();
    demande.setIsDemandeDeLitFromHosp((Boolean)callFunction(request, new CallableStatementCallback<Boolean>() {

        public Boolean doInCallableStatement(CallableStatement cs) throws SQLException, DataAccessException {
            cs.execute();
            return Boolean.valueOf(cs.getResultSet().toString());
        }
    }));
    return demande;
}

我遇到了这个错误:

org.springframework.jdbc.UncategorizedSQLException: CallableStatementCallback; uncategorized SQLException for SQL []; SQL state [99999]; error code [17004]; Type de colonne non valide: 1111; nested exception is java.sql.SQLException: Type de colonne non valide: 1111
    at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:83)
    at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:80)
    at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:80)
    at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:1032)
    at fr.mckesson.framework.persistence.plsql.AbstractProcedureDao.callFunction(AbstractProcedureDao.java:317)
    at fr.mckesson.business.venue.clinique.evenement.dao.implementation.DemandeLitDAO.isDemandeDelitFromHosp(DemandeLitDAO.java:42)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)

我哪里错了?

【问题讨论】:

  • 类型 1111 是 java.sql.Types.OTHER,某处的类型推断出了点问题。此外,我强烈建议您设置您的语言环境配置,以便收到英文错误消息。它使搜索类似问题变得更加容易(对于阅读您的问题的人来说可能更清楚)。
  • 您能否编辑您的问题以包含您的 AbstractProcedureDao.callFunction 方法的正文?我看不到您在 Java 代码中的哪个位置指定了函数返回的对象类型。 (顺便说一句,我不相信 cs.getResultSet() 在您的 CallableStatementCallback 中会起作用,因为您的函数不会返回结果集,但这还没有引起问题,因为您的代码没有到达它。 )

标签: spring oracle stored-procedures jdbc plsql


【解决方案1】:

您的代码在 error code [17004]; invalid column type: 1111 上失败。发生此错误是因为您的代码使用了 JDBC 无法识别的数据类型。

这可能是因为您的函数返回 BOOLEAN。 Boolean 不是有效的 SQL 数据类型。您也无法在简单的 Oracle SQL 查询中调用该函数。

确实,JDBC 确实提供了a mapping of bit to Java boolean and Boolean,但这仅适用于支持该非标准数据类型的数据库产品,而 Oracle 不是其中之一。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-27
    • 2020-07-12
    • 2014-04-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多