2010-04-20 5 views
2

À peu près ce qu'il dit dans le titre, comment diable est-ce censé être fait?Paramètres JDBC CallableStatement et Oracle SYS_REFCURSOR IN?

Fondamentalement, j'ai besoin de passer un curseur de référence null (vide?) En tant que paramètre IN à une procédure stockée.

/** spring's PreparedStatementSetter#setValues(...) */ 
public void setValues(PreparedStatement ps) throws SQLException { 
    CallableStatement cs = (CallableStatement) ps; 
    cs.setString(1,"constant"); 
    //this is the IN param 
    cs.setNull(2, OracleTypes.CURSOR); 
    //this is the OUT param 
    cs.registerOutParameter(3, OracleTypes.CURSOR); 
} 

Et cela échoue avec:

caused by: java.sql.SQLException: Unsupported feature: sqlType=-10 
    at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:112) 
    at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:146) 
    at oracle.jdbc.driver.OraclePreparedStatement.setNullCritical(OraclePreparedStatement.java:4399) 
    at oracle.jdbc.driver.OraclePreparedStatement.setNullInternal(OraclePreparedStatement.java:4161) 
    at oracle.jdbc.driver.OracleCallableStatement.setNull(OracleCallableStatement.java:4472) 

Je suis un peu perdu, essayé plusieurs façons de le faire, mais je ne pouvais pas trouver des exemples à ce sujet et ont aucune idée comment pour le faire correctement.

Répondre

0

Mon java est un peu rouillé, mais vous devriez être en mesure d'initialiser votre REF variable curseur dans un bloc PL/SQL:

problème
String statement = "DECLARE\n" + 
         "l_cursor SYS_REFCURSOR;\n" + 
        "BEGIN\n" + 
         "your_procedure(?, l_cursor, ?);\n" + 
        "END;" 
CallableStatement cs = yourConnection.prepareCall(statement); 
// bind first and last parameter 
cs.setString(1,"constant"); 
cs.registerOutParameter(2, OracleTypes.CURSOR); 
+0

avec cette approche est que im en utilisant Spring Batch et un StoredProcedureItemReader, pour que je viens de donner un paramètre String qui est le nom de la procédure, et une liste d'objets SqlParameter qui créent CallableStatement (voir: http://static.springsource.org/spring-batch/reference/html/readersAndWriters.html#StoredProcedureItemReader) , donc à moins que quelque chose de spécial existe dans la fonctionnalité sring core jdbc, je serai limité à l'aide de la référence CallableStatement directement pour définir les paramètres – deebo

+0

@deebo: Dans ce cas, vous pouvez créer un PL/SQ L encapsuleur de procédure qui prend uniquement les deux paramètres et appelle la procédure stockée avec un argument NULL. –

+0

La racine du problème était le pilote Oracle JDBC, dont j'avais une version qui ne supportait pas les curseurs comme paramètres IN. J'ai mis à jour le pilote et tout a commencé à fonctionner comme par magie. – deebo