L'appel de procédure stockée oracle à l'aide de printemps de la procédure stockée
J'ai essayé d'obtenir un morceau de code qui utilise le printemps et l'oracle de la procédure stockée avec des paramètres, mais ont de la difficulté à exécuter. La procédure stockée comme spécifié est destiné à s'attendre à trois paramètre, mais dans l'erreur, il semble qu'il s'attend à quatre. Le quatrième paramètre est un curseur à être retourné.
Voici mon Oracle(9i) spécification de paquetage:
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;
Ci-dessous est le corps de package:
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;
Voici un extrait de mon intervention en Classe
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;
}
}
Et ci-Dessous est ma DAO méthode de mise en Œuvre
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;
}
Après le succès de compliation je reçois le message d'erreur ci-dessous au moment de l'exécution
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
OriginalL'auteur Ololade enifeni | 2012-09-21
Vous devez vous connecter pour publier un commentaire.
Vos appels à declareParameter() doit être dans le même ordre que la procédure stockée Oracle. Essayez ceci:
OriginalL'auteur GriffeyDog
créer un bean pour la source de données de configuration:
Créer un dao avec référence à qui vous injecter votre source de données (applicationContext.xml):
Ensuite créer une classe pour convertir Oracle Tableau de java Liste
Puis créer TestDao à l'appel de la procédure::
OriginalL'auteur Ravi Kant