【问题标题】:How to get cursor result using Spring Jdbc?如何使用 Spring Jdbc 获取游标结果?
【发布时间】:2015-08-12 02:34:30
【问题描述】:

我是 Spring 的新手。 我正在尝试调用以游标形式返回结果的存储过程。即使使用OracleTypes.CURSOR.,我也尝试使用 rowMapper 但是每次我遇到错误。我使用的是Oracle数据库。我无权更改数据库程序,所以只能选择使用java代码实现。请指导我。我在哪里做错了。我尝试了所有 jdbc 选项来传递参数但无法弄清楚。

程序

create or replace PROCEDURE SELECT_DETAILS
(IN_Logged_User_ID NUMBER)
AS
cursor SELECT_ALL_DATA is
    select
        type,
        type_desc,
        file_format,
        decode(active_flg, 'Y',1,0) as active_flg,
        to_char(modified_date, 'mm/dd/yyyy hh24miss') as modified_date
    from documentType
    order by doc_type;
ERR_MSG varchar2(600);
APP_ERROR exception;
Err_no       NUMBER;
BEGIN
  IF Err_no = -1 THEN
  RAISE APP_ERROR;
     RETURN;
  END IF;

    BufferMgr.ClearBuffer;
    BufferMgr.MaxColumns(6);
    for dttRow in SELECT_ALL_DATA
    loop
        BufferMgr.PutColumn(dttRow.doc_type);
        BufferMgr.PutColumn(dttRow.doc_type);
        BufferMgr.PutColumn(dttRow.doc_type_desc);
        BufferMgr.PutColumn(dttRow.def_file_format);
        BufferMgr.PutColumn(dttRow.active_flg);
        BufferMgr.PutColumn(dttRow.modified_date);
        BufferMgr.NewRow;
    end loop;

    exception
    when APP_ERROR then
        Rollback;
        BufferMgr.PutColumn('!@#$' || ERR_MSG);
        BufferMgr.NewRow;
        RAISE BufferMgr.app_errors_exit;
    when others then
        Rollback;
        BufferMgr.PutColumn('!@#$' || TrackORAError(SQLCODE,SQLERRM));
        BufferMgr.NewRow;
        RAISE BufferMgr.app_errors_exit;
END;

Java

public Map<?, ?> simpleProcedureCall(String procedureName,Long loginId){
        SimpleJdbcCall procReader = new SimpleJdbcCall(jdbcTemplate);
        procReader.withProcedureName(procedureName).declareParameters(new SqlOutParameter("SELECT_ALL_DATA",OracleTypes.CURSOR, new DocTypeMapper()),
                new SqlParameter("IN_Logged_User_ID", Types.NUMERIC));
        SqlParameterSource inParams = new MapSqlParameterSource().addValue("IN_LOGGED_USER_ID", loginId,Types.NUMERIC);
        Map<String, Object> simpleJdbcCallResult =  procReader.execute(inParams);
        return simpleJdbcCallResult;
    }

    private class DocTypeMapper implements RowMapper<DocumentType> 
    {
        @Override
        public DocumentType mapRow(ResultSet rs, int rowNum) throws SQLException {

             DocumentType docTypeObject = new DocumentType();
             docTypeObject.setDocType(rs.getString("type"));
             docTypeObject.setDescription("type_desc");
             docTypeObject.setFileFormat("file_format");
             docTypeObject.setIsActive("active_flg");
             docTypeObject.setLastModified("modified_date");
            return docTypeObject;
        }  

    }

错误。

Caused by: org.springframework.jdbc.BadSqlGrammarException: CallableStatementCallback; bad SQL grammar [{call SELECT_DETAILS()}]; nested exception is java.sql.SQLException: ORA-06550: line 1, column 7:
PLS-00306: wrong number or types of arguments in call to 'SELECT_DETAILS'
ORA-06550: line 1, column 7:
PL/SQL: Statement ignored

    at org.springframework.jdbc.support.SQLErrorCodeSQLExceptionTranslator.doTranslate(SQLErrorCodeSQLExceptionTranslator.java:231)
    at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:73)
    at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:1137)
    at org.springframework.jdbc.core.JdbcTemplate.call(JdbcTemplate.java:1173)
    at org.springframework.jdbc.core.simple.AbstractJdbcCall.executeCallInternal(AbstractJdbcCall.java:378)
    at org.springframework.jdbc.core.simple.AbstractJdbcCall.doExecute(AbstractJdbcCall.java:341)
    at org.springframework.jdbc.core.simple.SimpleJdbcCall.execute(SimpleJdbcCall.java:190)
    at com.apple.ist.nfa.shared.dao.ProcedureExecutorDAO.simpleProcedureCall(ProcedureExecutorDAO.java:56)
    at com.apple.ist.nfa.service.controller.impl.DocumentService.getDocumentType(DocumentService.java:51)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:497)
    at org.jboss.resteasy.core.MethodInjectorImpl.invoke(MethodInjectorImpl.java:137)
    at org.jboss.resteasy.core.ResourceMethodInvoker.invokeOnTarget(ResourceMethodInvoker.java:296)
    at org.jboss.resteasy.core.ResourceMethodInvoker.invoke(ResourceMethodInvoker.java:250)
    at org.jboss.resteasy.core.ResourceMethodInvoker.invoke(ResourceMethodInvoker.java:237)
    at org.jboss.resteasy.core.SynchronousDispatcher.invoke(SynchronousDispatcher.java:356)
    ... 30 more
Caused by: java.sql.SQLException: ORA-06550: line 1, column 7:
PLS-00306: wrong number or types of arguments in call to 'SELECT_DETAILS'
ORA-06550: line 1, column 7:
PL/SQL: Statement ignored

【问题讨论】:

    标签: java spring spring-batch spring-jdbc


    【解决方案1】:

    好吧,在您的 Java 中,您正在从过程声明一个输出参数 (SELECT_ALL_DATA),而该过程声明本身似乎并不存在。您可能想尝试以下方法:

        create or replace PROCEDURE SELECT_DETAILS
        (IN_Logged_User_ID NUMBER, SELECT_ALL_DATA OUT SYS_REFCURSOR)
        AS
        OPEN SELECT_ALL_DATA FOR
            select
                type,
                type_desc,
                file_format,
                decode(active_flg, 'Y',1,0) as active_flg,
                to_char(modified_date, 'mm/dd/yyyy hh24miss') as modified_date
            from dtt
            order by doc_type;
        --etc
    

    我不知道BufferMgr 的所有内容是做什么用的,所以无法评论该部分..

    【讨论】:

    • 我无权更改程序定义。其实我们只能在java端改变
    猜你喜欢
    • 2013-04-09
    • 1970-01-01
    • 2016-08-12
    • 2017-06-18
    • 1970-01-01
    • 1970-01-01
    • 2019-08-26
    • 2012-06-21
    • 1970-01-01
    相关资源
    最近更新 更多