簡體   English   中英

如何使用Spring Jdbc獲得光標結果?

[英]How to get cursor result using Spring Jdbc?

我是Spring的新人。 我試圖調用存儲過程,該過程以游標的形式返回結果。即使是OracleTypes.CURSOR.也嘗試使用rowMapper OracleTypes.CURSOR. 但是每次遇到錯誤時,我都在使用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;

爪哇

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中,您正在從過程中聲明一個輸出參數( 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全部BufferMgr是什么,因此無法在該部分發表評論。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM