java - 使用spring存储过程调用oracle存储过程

标签 java spring stored-procedures oracle9i java-ee-5

我一直在尝试获取一段使用带参数的spring和oracle存储过程的代码,但一直发现很难运行。指定的存储过程预期需要三个参数,但在错误中它似乎需要四个参数。第四个参数是要返回的游标。

这是我的 Oracle(9i) 包规范:

CREATE OR REPLACE PACKAGE  pkg_data_load AS
procedure sp_atm_withdrawal(p_catermid IN VARCHAR2,
p_start_date IN VARCHAR2,p_end_date IN VARCHAR2,p_out out sys_refcursor);
END;

下面是包体:

CREATE OR REPLACE PACKAGE BODY pkg_data_load
AS  
procedure sp_atm_withdrawal
(
p_catermid IN VARCHAR2,
p_start_date IN VARCHAR2,
p_end_date IN VARCHAR2,
p_out out sys_refcursor 
) as
v_start_date date := to_date(p_start_date,'yyyy/mm/dd');
v_end_date date := to_date(p_end_date,'yyyy/mm/dd');
begin
open p_out for select 
b.nam_branch BRANCH_NAME
, a.bcode brn_Code
, a.acct_no Acct_no
from table a, table b where b.cod_Cc_brn= a.cod_org_brn 
and a.cod_reply=0 
and b.flg_mnt_status='A' 
and a.cod_proc not in ( 312000, 382000, 311000, 381000) 
and a.cod_txn_literal<>'SCD' 
and a.ca_term_id in (
select ca_term_id from tablec where flg_mnt_status='A')
and a.dat_post_stl between v_start_date and  v_end_date
and a.ca_term_id = p_catermid;
end sp_atm_withdrawal;
END pkg_data_load;

这是我的过程类的片段

public class AtmStoredProcedures extends StoredProcedure {
public AtmStoredProcedures(JdbcTemplate jdbcTemplate, String procedure)
{
super(jdbcTemplate,procedure);
AtmRowMapper rowMapper = new AtmRowMapper();
declareParameter(new SqlOutParameter("sys_refcursor",OracleTypes.CURSOR, rowMapper));
declareParameter(new SqlParameter("branch", Types.VARCHAR));
declareParameter(new SqlParameter("startDate", Types.VARCHAR));
declareParameter(new SqlParameter("endDate", Types.VARCHAR));
compile();
}
public Map getCashWithdrawals(String branch, String startDate, String endDate)
{
Map inParam = new HashMap();
inParam.put("branch", branch);
inParam.put("startDate", startDate);
inParam.put("endDate", endDate);
Map out = execute(inParam); // Call on parent class
return out;
}
}

下面是我的DAO实现方法

public List<Atm> loadWithdrawal(String branch, String startDate, String endDate) {
if (this.jdbcTemplate == null) {
System.out.print("JDBC TEMPLATE IS NULL");
}
List<Atm> withdrawals = null;
try
{
AtmStoredProcedures st = new  AtmStoredProcedures(jdbcTemplate,"pkg_data_load.sp_atm_withdrawal");
Map results = st.getCashWithdrawals(branch, startDate, endDate);
withdrawals = (List<Atm>) results.get("sys_refcursor");
} catch (DataAccessException ex) {
System.out.print(ex.getMessage());
}
return withdrawals;
}

成功编译后,我在运行时收到以下错误

CallableStatementCallback; bad SQL grammar 
[{call pkg_data_load.sp_atm_withdrawal(?, ?, ?, ?)}]; 
nested exception is java.sql.SQLException: 
ORA-06550: line 1, column 7: PLS-00306: wrong number or 
types of arguments in call to 'SP_ATM_WITHDRAWAL'ORA-06550: 
line 1, column 7: PLS-00306: wrong number or types of arguments 
in call to 'SP_ATM_WITHDRAWAL'
ORA-06550: line 1, column 7:
PL/SQL: Statement ignored

最佳答案

您对 declareParameter() 的调用必须与 Oracle 存储过程的顺序相同。试试这个:

declareParameter(new SqlParameter("branch", Types.VARCHAR)); 
declareParameter(new SqlParameter("startDate", Types.VARCHAR)); 
declareParameter(new SqlParameter("endDate", Types.VARCHAR)); 
declareParameter(new SqlOutParameter("sys_refcursor",OracleTypes.CURSOR, rowMapper)); 

关于java - 使用spring存储过程调用oracle存储过程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12532256/

相关文章:

java - Spring Cloud Service 向 Discovery Server 注册,但随后取消注册并停止

spring - Spring Security 中带有查询参数的 URL 的 regexMatcher

java - PowerMockito.whenNew 不工作

java - 将实体保存到数据存储后找不到实体

java - 显示 : exception is never thrown in body of try statement 的语法警告

sql-server - 微软 SQL : Use a stored procedures result set in another query?

java - Postgresql 从表中返回 SETOF 行

Java - new URL(...) 不会转义第一个字符

java - Spring Boot 与 Groovy 模板——无法迭代 ModelAndView 中的列表

mysql - 在MYSQL中的表中插入0到999999行