当前位置: 首页 > 知识库问答 >
问题:

SimpleJdbcCall的spring“Cursor is closed”异常

班凌
2023-03-14

存储过程运行良好。我在SQL Navigator中测试了它,每次都运行正常。

这是我得到的异常堆栈:

private class GetStandardReportExtrasSPV2{
    int nAreaLevel;
    int nAssignment;
    int nUserRole;
    int nAcisNum = 0;
    String strAreaMenu;     
    String strLDO = null;

    private SimpleJdbcCall procGetReportExtras;

    public GetStandardReportExtrasSPV2(DataSource ds, int nUserRole, String strAreaMenu,
            int nAssignment, int nAreaLevel, String strLDO, int nAcisNum) {

        JdbcTemplate jdbcTemplate = new JdbcTemplate(ds);
        jdbcTemplate.setResultsMapCaseInsensitive(true);

        this.procGetReportExtras =
                new SimpleJdbcCall(jdbcTemplate)
                    .withCatalogName("PKG_RPT_STE_DATA")
                    .withProcedureName("GetCoreReportExtras")
                     .returningResultSet("CURREPORTLIST",
                                ParameterizedBeanPropertyRowMapper.newInstance(Report.class));
    }

    public List<Report> getReportsList() {

        HashMap<String, Object> params = new HashMap<String, Object>();

        params.put("PNASSIGNMENT", new Integer(nAssignment));
        params.put("PNUSERROLE", new Integer(nUserRole));
        params.put("PSAREAMENU", strAreaMenu);
        params.put("PNAREALEVEL", new Integer(nAreaLevel));
        params.put("PSLDO", strLDO);
        params.put("PNACISNUMBER", new Integer(nAcisNum));

        if (nAcisNum > 0)
            params.put(ACIS_NUMBER, nAcisNum);

        SqlParameterSource in = new MapSqlParameterSource().addValues(params);

        Map m = procGetReportExtras.execute(in);
        return (List) m.get("CURREPORTLIST");
    }

}

这是Oracle存储过程:

   PROCEDURE GetCoreReportExtras
    ( pnAssignment IN NUMBER,
      pnUserRole in NUMBER,
      psAreaMenu in VARCHAR2,
      pnAreaLevel in NUMBER,
      curReportList OUT outcur,
      psLDO in VARCHAR2 default 'none',
      pnAcisNumber in NUMBER default 0) IS

   BEGIN
        --start working through roles...
        IF substr(psAreaMenu,1,1) <> '7' and pnAssignment > 74999 --CAM Area of some sort
        THEN
            -- these users never get an HBDC or QBR...
           --NOTHING WILL BE RETURNED
           open curReportList for
                    SELECT FILE_NAME, NULL AS DISPLAY_TEXT

                    FROM CORE_REPORT_NAME
                    WHERE STATIC_REPORT_TYPE = 'XXXXXXXX';
        ELSE -- Non-CAM, Non-GPO...Check traditional Sales first...
            IF substr(psAreaMenu,1,1) = '7' THEN --Sales Assignment of some sort
                -- retrieve the HBDC File Name for these sales users...
                open curReportList for
                    SELECT FILE_NAME, 'Anemia Worksheet Link' AS DISPLAY_TEXT
                    FROM CORE_REPORT_NAME
                    WHERE STATIC_REPORT_TYPE = 'HBDCANEMIA'
                    UNION
                    SELECT FILE_NAME, 'HBDC Bone Metabolism Worksheet Link' AS DISPLAY_TEXT
                    FROM CORE_REPORT_NAME
                    WHERE STATIC_REPORT_TYPE = 'HBDC_BONE';
                -- sales-perspective users don't see a QBR...
                --NOTHING IS RETURNED FOR QBR
            ELSE -- Callpoint or Top-SDO Assignment
                IF pnUserRole = 11 THEN --TOP SDO
                    --  These users don't see HBDC...
                    --NOTHING IS RETURNED FOR HBDC
                    -- but they do get the QBR...
                    open curReportList for
                        SELECT FILE_NAME, 'CIDO Report Selection' AS DISPLAY_TEXT
                        FROM CORE_REPORT_NAME
                        WHERE STATIC_REPORT_TYPE = 'QBR'
                        and SHORT_NAME = psAreaMenu;
                --ELSE -- Some form of Callpoint
                    -- these perspectives don't get QBR or HBDC
                    --NOTHING WILL BE RETURNED
                END IF;
            END IF;
        END IF;
   END GetCoreReportExtras;

有什么线索告诉我为什么我会得到这个例外吗?

共有1个答案

盖锦程
2023-03-14

我从它所在的包含类中取出了代码,它工作得很好。

 类似资料:
  • org.springframework.jdbc.core.SimpleJdbcCall类是一个多线程,可重用的对象,表示对存储过程或存储函数的调用。 它提供元数据处理,以简化访问基本存储过程/函数所需的代码。 您需要提供的只是过程/函数的名称以及执行调用时包含参数的映射。 提供的参数的名称将与创建存储过程时声明的in和out参数匹配。 Class 声明 (Class Declaration) 以

  • org.springframework.jdbc.core.SimpleJdbcCall类是一个多线程,可重用的对象,表示对存储过程或存储函数的调用。 它提供元数据处理,以简化访问基本存储过程/函数所需的代码。 您需要提供的只是过程/函数的名称以及执行调用时包含参数的映射。 提供的参数的名称将与创建存储过程时声明的in和out参数匹配。 Class 声明 (Class Declaration) 以

  • 从升级Spring框架之后 无法确定正确的调用签名-“我的存储过程名称”没有过程/函数/签名 例外情况。然后我进行了调试,发现如果存储过程位于同义词后面,则无法找到它。对于旧的Spring版本,这不是问题。那么他们改变了什么?我现在能做什么?我阅读了有关从数据源检索原始Oracle连接并激活同义词标志的内容:https://docs.oracle.com/cd/E11882_01/appdev.1

  • 如何测试使用JdbcTemplate和SimpleJDBCall的repository类,如下所示 这就是我尝试过的 下面是测试代码和存储库代码,我使用的是Spring Boot最新版本junit5和mockito。我已经尝试了下面的解决方案,但可以让它工作 带Spring JdbcTemplate的SimpleJDBCall的Mockito 下面是存储库代码@repository public

  • 我有一个使用SimpleJDBCCall调用DB过程的DAO函数。但是,我无法读取存储过程返回的CLOB数据。当我尝试对返回的CLOB值(result.get(“out_rtn_xml”))执行.toString()时,我只在字符串中得到以下内容:oracle.sql.CLOB@f762282a 下面是代码片段。

  • 我想用SimpleJdbcCall执行带有动态参数的存储过程。在SQL服务器SP中,我总共有6个可选参数,其中我必须能够通过任何参数或不通过任何参数。我的SP在MS Studio中执行得很好。但不是通过SimpleJdbcCall。我尝试了很多方法,其中之一是使用NamedBding。但是它会给“=”附近的输入语法错误,如下所示。 日志: 2019-01-31 18:14:49DEBUG Simp