2010-07-15 10 views
3

Je suis en train de déboguer un problème avec un ResultMap nul retourné d'appeler une procédure stockée via iBatis pour Java. Voici une copie tronquée de l'exception que je reçois.Erreur iBatis lors de l'application de la carte de paramètres - Provoquée par SQLException: Curseur est fermé

DataAccessException: Exception calling procedure 
Caused by: com.ibatis.common.jdbc.exception.NestedSQLException: 
--- The error occurred in ibatis-map.xml. 
--- The error occurred while applying a parameter map. 
--- Check the getEmpLoanDistribContribInfoMap. 
--- Check the output parameters (retrieval of output parameters failed). 
--- Cause: java.sql.SQLException: Cursor is closed. 

Je ne crois pas que le problème est en fait sur la carte des paramètres, puisque le code similaire fonctionne dans d'autres domaines du projet, mais j'ai inclus la carte des paramètres et l'en-tête de procédure stockée ici juste au cas où.

<parameterMap id="getEmpLoanDistribContribInfoMap" class="map" > 
    <parameter property="resultCode" javaType="int" jdbcType="NUMERIC" nullValue="-1" mode="OUT"/> 
    <parameter property="client_id" javaType="int" jdbcType="NUMERIC" mode="IN"/> 
    <parameter property="emp_nbr" javaType="int" jdbcType="NUMERIC" mode="IN"/> 
    <parameter property="general_info" javaType="result" jdbcType="ORACLECURSOR" mode="OUT"/> 
    <parameter property="current_contrib_info" javaType="result" jdbcType="ORACLECURSOR" mode="OUT"/> 
    <parameter property="future_contrib_info" javaType="result" jdbcType="ORACLECURSOR" mode="OUT"/> 
    <parameter property="distrib_info" javaType="result" jdbcType="ORACLECURSOR" mode="OUT"/> 
    <parameter property="loan_info" javaType="result" jdbcType="ORACLECURSOR" mode="OUT"/> 
</parameterMap> 

function get_emp_ldc_info (
    client_id     employees.clt_id%type, 
    emp_nbr     employees.emp_nbr%type, 
    general_info    out retire_ref_types.retire_ref_cursor, 
    current_contrib_info  out retire_ref_types.retire_ref_cursor, 
    future_contrib_info  out retire_ref_types.retire_ref_cursor, 
    distrib_info    out retire_ref_types.retire_ref_cursor, 
    loan_info     out retire_ref_types.retire_ref_cursor 
) return number is 
    retval number; 

Chacune des 5 curseurs ci-dessus sont ouverts pour sélectionne dans le corps de la fonction. J'ai extrait chaque requête select, et tous fonctionnent correctement (bien que certains ne trouvent aucun enregistrement - cela pourrait-il être mon problème?). J'ai même créé un script reflétant cette fonction qui définit chaque curseur dans un bloc declare, et les ouvre. Aucune exception n'est rencontrée.

Je me rends compte que mon problème pourrait très bien être de mauvaises données, mais je ne sais pas où chercher. La seule chose que je peux penser est que je devrait obtenir cette exception si l'un des curseurs de sortie dans la carte de paramètres est ouvert pour une sélection qui ne trouve aucune donnée. Est-ce que quelqu'un sait si cela est vrai?

Répondre

2

J'ai confirmé que c'était de mauvaises données provoquant cela. Je n'ai toujours pas trouvé où c'est, mais je réponds à la question pour que personne ne perds son temps là-dessus. Merci d'avoir lu.