2013-01-08 2 views
2

J'ai la procédure stockée suivante définie:Comment utiliser un paramètre IN OUT CLOB défini dans un processus stocké dans Oracle JDBC?

CREATE OR REPLACE PROCEDURE NOTIFY_INSERT (
    FLAG IN VARCHAR2, 
    MESSAGE IN OUT CLOB, 
    SEQ_NO OUT NUMBER 
) 
AS 
BEGIN 
... 
END; 

Maintenant, je suis en train d'appeler cette procédure stockée dans JDBC. Cependant, j'obtiens une exception disant "java.sql.SQLException: Parameter Type Conflict". Ceci est soulevé de la ligne

call.execute(); 

Je devine qu'il a quelque chose à voir avec le second paramètre, qui est un CLOB.

Est-ce que quelqu'un a une idée de ce que je fais mal?

Merci pour votre aide.

Connection connection = dataSource.getConnection(); 
CallableStatement call = null; 
try { 
    call = connection.prepareCall("{ call NOTIFY_INSERT (?,?,?) }"); 
    call.setString(1, flag); 
    call.registerOutParameter(2, Types.CLOB); 
    call.setString(2, message); 
    call.registerOutParameter(3, Types.NUMERIC); 
    call.execute(); 
    sequenceNo = call.getLong(3); 
    message = call.getString(2); 
} catch (SQLException e) { 
    e.printStackTrace(); 
} finally { 
    if (call != null) { 
     try { call.close(); } catch (SQLException sqle) {} 
    } 
} 

JDBC Exception:

java.sql.SQLException: Parameter Type Conflict 
    at oracle.jdbc.driver.OraclePreparedStatement.processCompletedBindRow(OraclePreparedStatement.java:2480) 
    at oracle.jdbc.driver.OraclePreparedStatement.executeInternal(OraclePreparedStatement.java:4356) 
    at oracle.jdbc.driver.OraclePreparedStatement.execute(OraclePreparedStatement.java:4595) 
    at oracle.jdbc.driver.OracleCallableStatement.execute(OracleCallableStatement.java:10100) 
    at oracle.jdbc.driver.OraclePreparedStatementWrapper.execute(OraclePreparedStatementWrapper.java:5693) 
    at org.apache.commons.dbcp.DelegatingPreparedStatement.execute(DelegatingPreparedStatement.java:172) 
    at org.apache.commons.dbcp.DelegatingPreparedStatement.execute(DelegatingPreparedStatement.java:172) 

Répondre

3

Je ne pense pas que vous pouvez passer une chaîne directement à un paramètre de type CLOB. Lors d'une tentative de lier un paramètre CLOB, vous pouvez effectuer les opérations suivantes:

Si vous avez déjà un Clob:

call.setClob(1, clob); 

Si vous voulez convertir un String en Clob:

call.setCharacterStream(1, new StringReader(string), string.length()); 

Si vous souhaitez définir une valeur CLOB nulle:

call.setNull(1, Types.CLOB); 

Vous pouvez également voir this solution.

+0

Je dois encore tester cette solution, mais elle semble être la bonne solution. Je vous ferai savoir si je suis capable de le faire fonctionner ... –

+0

@LateDownvoter: Pourquoi le downvote? Et pourquoi 1 mois et demi plus tard? – rgettman

+0

Je ne sais pas qui downvoted, mais j'ai voté. C'était la bonne réponse. –

Questions connexes