2010-05-26 5 views
0

J'ai rencontré quelques frustrations en essayant de faire fonctionner une simple procédure de récupération de curseur Oracle avec JDBC.Récupération d'Oracle Cursor avec JDBC

Je continue d'obtenir une erreur de "[Oracle] [ODBC] [Ora] ORA-06553: PLS-306: nombre incorrect ou types d'arguments dans l'appel à" GETNAME "", mais je ne peux pas comprendre ce que je Je fais mal.

Voici mon code en Java:

CallableStatement stmt = connection.prepareCall("call getName(?)"); 
stmt.registerOutParameter(1, OracleTypes.CURSOR); 
stmt.execute(); 

stmt.close(); 
con.close(); 

Voici ma procédure Oracle:

CREATE OR REPLACE PROCEDURE getName(cur out SYS_REFCURSOR) 
IS 
BEGIN 
    OPEN cur FOR 
     SELECT name FROM customer; 
END; 

L'erreur se produit sur stmt.execute().

Merci d'avance. Par ailleurs, je travaille avec Oracle 10.2.0.

+0

Quel fichier jar JDBC compilez-vous et exécutez-vous? –

Répondre

2

J'ai essayé essentiellement la même chose et cela a fonctionné pour moi. La seule différence était que la bibliothèque Oracle JDBC que j'utilise n'a pas de méthode registerOutputParameter; J'ai utilisé registerOutParameter à la place. Vous appelez peut-être une méthode JDBC générique au lieu de celle spécifique à Oracle qui prend en charge les types Oracle. La seule autre explication que je peux penser est que votre code Java se connecte au mauvais schéma, et l'accès à un objet différent getName.

+0

Désolé, j'ai mal tapé le nom de la méthode. Y at-il un paramètre Oracle ou un problème non lié au code qui peut provoquer cette erreur? – BeginnerAmongBeginners

+0

Il s'est avéré que le curseur fonctionne correctement avec le client léger Oracle JDBC, mais pas avec ODBC. Je ne suis pas sûr de la cause, puisque j'ai activé les ensembles de résultats pour ODBC. – BeginnerAmongBeginners

0

Non, c'est faux. Vous ne devriez pas retourner un curseur brut. Vous devriez appeler le proc stocké et parcourir le ResultSet.

+0

Dépend de la base de données ... SQL Server et Sybase, par exemple, peuvent renvoyer des jeux de résultats à partir d'une procédure stockée - mais dans Oracle, vous devez renvoyer un Curseur. – AWhitford

+0

Non, ce dont je parlais * il y a deux ans * renvoyait un curseur brut ou ResultSet hors de votre niveau de persistance. Vous devez itérer dessus, charger le contenu dans une structure de données, un objet ou une collection quelconque et fermer le curseur ou ResultSet. Vous n'aurez pas de fuites de mémoire ou le nombre maximum de curseurs dépassés de cette façon. Je pense que vous avez mal compris. Vous pourriez vouloir reconsidérer votre vote négatif. – duffymo