[英]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.