IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

JDBC Java Discussion :

Récupérer plusieurs lignes d'une fonction stockée pipeline oracle


Sujet :

JDBC Java

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Madagascar

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2008
    Messages : 20
    Points : 28
    Points
    28
    Par défaut Récupérer plusieurs lignes d'une fonction stockée pipeline oracle
    Bonjour,

    J'ai voulu créer un programme java à partir duquel je récupére le contenu d'une table qui a 3 colonne (de types différents). Dans la fonction oracle j'ai réussi à extraire les données en créant des types et en utilisant un pipeline. Malheuresement, je n'arrive pas à récupérer ces données sur oracle, je ne sais pas le type à déclarer dans output, j'ai essayé, un array, un objet... un cursor mais ça renvoie toujours des erreurs.

    Ci-après le code oracle
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
     
    create or replace
    FUNCTION GET_STATEMENT (wmsisdn in VARCHAR2, accountnbr in VARCHAR2) RETURN LMVTS PIPELINED AS
    MOUVEMENT LMVTS;
    PDATOPER DATE;
    PLIBELLE VARCHAR(20);
    PMNTDEV NUMBER;
    MyCounter number;
     
    CURSOR C1 IS select  datoper,substr(libelle,1,20),mntdev  from STATEMENT s
    where  s.compte = accountnbr
    and  s.msisdn = wmsisdn;
     
        BEGIN
               OPEN C1;
               LOOP 
                   FETCH C1  INTO PDATOPER, PLIBELLE,PMNTDEV;
                   Exit when C1%NOTFOUND ;
                   PIPE ROW (MVT(PDATOPER, PLIBELLE,PMNTDEV));                 
                   END LOOP;
               CLOSE C1 ;
     
       --  RETURN MOUVEMENT;
      --   EXCEPTION WHEN NO_DATA_FOUND THEN RETURN (NULL);
    END  GET_STATEMENT;
    Voici le code Java

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
     
     
     
        void ministatement(Connection Conn,String wmsisdn, String account){
        		try  {
        		String sql1= "{?= call GET_STATEMENT(?,?)}";
        		CallableStatement Stat = Conn.prepareCall(sql1);
    		    Stat.registerOutParameter(1,oracle.jdbc.OracleTypes.CURSOR);
    			Stat.setString(2,wmsisdn);
    			Stat.setString(3,account);
    			Stat.execute();
    			ResultSet resultat = Stat.getResultSet();
     
    			System.out.println(resultat);
     
    		}   catch(Exception e){e.printStackTrace();}
        }
    Ici, l'affichage du console
    java.sql.SQLException: ORA-06550: line 1, column 10:
    PLS-00653: aggregate/table functions are not allowed in PL/SQL scope
    ORA-06550: line 1, column 13:
    PLS-00382: expression is of wrong type
    ORA-06550: line 1, column 7:
    PL/SQL: Statement ignored
    Je vous remercie pour votre aide.

    Christian

  2. #2
    Nouveau membre du Club
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Madagascar

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2008
    Messages : 20
    Points : 28
    Points
    28
    Par défaut
    Ou si quelqu'un pourrait me donner d'autres idée sans passer par le pipeline. Car en réalité, pour l'affichage, les données dont j'ai besoin, sont de lignes chaînes de caractère. Mais là, il me faut créer encore des types tables de varchar2 dans oracle.

    Et la question c'est comment reconnaitre ce type dans java...

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Madagascar

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2008
    Messages : 20
    Points : 28
    Points
    28
    Par défaut Cursor
    Re: bonjour

    Après avoir passer plusieurs semaines à chercher la solution.
    J'ai trouvé un truc sans passer par les pipelines pour récuperer les lignes de ma table oracle à partir de java.
    Il faut créer un type REF CURSOR, renvoyer les lignes dans le curseur en selectionnant tous les colonnes.

    Le type de retour récupérer dans java serait alors OracleTypes.CURSOR.
    Ci-après le code oracle :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    create or replace
    PACKAGE types
    AS
        TYPE ref_cursor IS REF CURSOR;
    END;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    FUNCTION GET_STATEMENT(wmsisdn in VARCHAR2, accountnbr in VARCHAR2) 
        RETURN types.ref_cursor
    AS
        mvt_cursor types.ref_cursor;
    BEGIN               
        OPEN mvt_cursor FOR 
            SELECT DATOPER,substr(libelle,1,14),mntdev FROM STATEMENT
            WHERE compte = accountnbr
            ORDER BY DATOPER DESC;
     
        RETURN mvt_cursor;
    END GET_STATEMENT;
    Puis ensuite le code java :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
     
    public void ministatement(Connection Conn, String wmsisdn,String account){
        	try {
        	String sql1= "{?= call PK_MBANKING.GET_STATEMENT	(?,?)}";
    			CallableStatement Stat = Conn.prepareCall(sql1);
    			Stat.registerOutParameter(1,OracleTypes.CURSOR);
    			Stat.setString(2,wmsisdn );
    			Stat.setString(3,account);
    			Stat.execute();
    			ResultSet rs = (ResultSet)Stat.getObject(1);
     
    			while (rs.next()) {
    			    System.out.println(rs.getDate(1).toString() + " " +
    			        rs.getString(2) + " " +
    			        rs.getFloat(3));
    			}
     
     
        	}   catch(Exception e){e.printStackTrace();}
     
        }
    Réponse du console

    2012-01-23 OPERATION1 -2000.0
    2012-01-12 OPERATION2 -1000.0
    merci bien !

Discussions similaires

  1. Réponses: 5
    Dernier message: 27/10/2011, 16h51
  2. [DEBUTANT]Récupérer plusieurs champs dans une procédure stockée
    Par tripper.dim dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 20/06/2007, 17h58
  3. Récupérer plusieurs lignes avec des procédures stockées
    Par GPZ{^_^} dans le forum SQL Procédural
    Réponses: 2
    Dernier message: 12/03/2007, 13h16
  4. Réponses: 3
    Dernier message: 23/01/2007, 09h20
  5. [MySQL] Récupérer plusieurs lignes d'une BDD
    Par orbitalxp dans le forum PHP & Base de données
    Réponses: 6
    Dernier message: 12/01/2007, 18h44

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo