2010-09-13 15 views
4

Je vais appeler une fonction, et définir certains paramètres par nom, par exemple:Java nommé le nom de paramètre (pour résultat de la fonction Oracle JDBC)

Connection c = null; 
    ResultSet rs = null; 
    String query; 
    PreparedStatement ps; 
    CallableStatement cs = null; 
    try { 
     c = DbUtils.getConnection(); 
     cs = c.prepareCall("{? = call get_proc_name(?, ?) }"); 
     cs.registerOutParameter(1, OracleTypes.VARCHAR); 
     cs.setInt("in_proc_type", ProcTypes.SELECT); 
     cs.setLong("in_table_id", tableId); 
     // here I should use something like cs.registerOutParameter("result", OracleTypes.VARCHAR); 
     cs.execute(); 

paramètres de la fonction PL/SQL sont:

CREATE OR REPLACE FUNCTION get_proc_name 
(
    in_proc_type IN NUMBER, /*1 - insert, 2 - update, 3 - delete, 4 - select*/ 
    in_table_name IN VARCHAR2 := NULL, 
    in_table_id IN NUMBER := NULL, 
    in_table_type_id IN NUMBER := NULL, 
    is_new IN NUMBER := 0 
) RETURN VARCHAR2 

La question est de savoir comment enregistrer le résultat en tant que paramètre out, puis l'obtenir de oracle à Java? Je peux enregistrer les paramètres in/out par nom, parce que je connais leurs noms de fonction, mais je ne sais pas comment obtenir le résultat de la fonction, quel nom de variable utiliser pour cela.

Les manuels décrivent uniquement les paramètres d'entrée/sortie d'utilisation avec des procédures et non des fonctions.

Oracle version: 11.1.0.6.0 version Java: 1.6.0_14

Répondre

0

Vous inscrivez le résultat de la fonction comme si elle était le premier paramètre. Évidemment, cela déplace la numérotation des paramètres réels.

Votre ligne déjà existante

cs.registerOutParameter(1, OracleTypes.VARCHAR); 

est tout ce qu'il faut. Après l'appel, obtenez votre résultat comme ceci:

String result = cs.getString(1); 
+0

J'ai une exception "Le nombre de noms de paramètres ne correspond pas au nombre de praremeters enregistrés" en ligne avec "cs.execute();" .... p.s. J'ai juste oublié de supprimer cette ligne quand posté le code. – Kerb

+0

IIRC vous ne pouvez pas mélanger des paramètres positionnels et nommés, il semble que vous devez utiliser des paramètres positionnels pour l'ensemble de l'instruction, c.setInt (2, ProcTypes.SELECT); cs.setLong (3, tableId); –

1

CallableStatement a un tas de registerXXX méthodes qui prennent index.

C'est comme ça que vous enregistrez le résultat. Il est le numéro de paramètre 1.

Dans votre cas,

cs.registerOutParameter(1, java.sql.Types.VARCHAR); 

< SPÉCULATION >
BTW, parce que vous utilisez l'index pour result, vous devrez peut-être utiliser des méthodes et qui suivent l'indice setXXX fournir une liste de paramètres complète.
</SPÉCULATION >

+0

J'ai obtenu « index de colonne non valide » en ligne avec cs.registerOutParameter (0, java.sql.Types.VARCHAR); – Kerb

+0

@Kerb. Désolé, c'est 1, j'ai corrigé la réponse. –

2

La solution consiste à utiliser uniquement des index pour les paramètres de paramètres. Ce code fonctionne comme prévu (mélange des index et des paramètres nommés ne fonctionne pas, donc, le problème de l'aide du paramètre du nom de variable de résultat ne pouvait pas être résolu, IMHO):

  c = DbUtils.getConnection(); 
      cs = c.prepareCall("{? = call get_proc_name(in_proc_type => ?, in_table_id => ?) }"); 
      cs.registerOutParameter(1, java.sql.Types.VARCHAR); 
      cs.setInt(2, ProcTypes.SELECT); 
      cs.setLong(3, tableId); 
      cs.execute(); 
      String procName = cs.getString(1); 
      cs.close();