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

PL/SQL Oracle Discussion :

Une iteration dans une fonction [Débutant(e)]


Sujet :

PL/SQL Oracle

  1. #1
    Invité
    Invité(e)
    Par défaut Une iteration dans une fonction
    Bonjour,

    Excusez moi de vous déranger mais je suis un peu perdu et je ne trouve pas d'indications sur internet. Je me mets depuis ce matin à Oracle. Pour ce faire, j'ai téléchargé l'oracle express edition 11gr2 et j'ai installé le sgbd sql developper d'oracle.
    Or, je testais la création d'une fonction:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    create or replace 
    function lolaget return varchar2 is
    retour varchar2(255);
    begin
     SELECT nom||' '||prenom INTO retour FROM LOLATEST;
      return retour;
    end lolaget;
    Comme vous pouvez le voir, il s'agit simplement d'un SELECT. Or, celui-ci est censé renvoyer plusieurs lignes. De ce fait, je me demandais comment faire pour réaliser une itération afin de traiter chacune des valeurs et de les concaténer avec un séparateur dans "retour" pour ensuite les traiter via un split en java quand je reçois les données.

    Je vous remercie d'avance pour vos réponses et vous souhaite une bonne journée.

    Cordialement,

    Naia
    Dernière modification par Waldar ; 21/03/2013 à 13h54. Motif: Titre

  2. #2
    Expert éminent sénior Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2007
    Messages : 5 611
    Points : 11 252
    Points
    11 252
    Par défaut
    Une fonction peut retourner un ref_cursor (un sort de pointer vers un curseur) mais il va falloir passer un peu plus de temps avec Oracle avant de comprendre bien les divers concepts d’Oracle (curseur par exemple).

    Concaténer les données en SQL pour les "splitter" en java n'est qu'une perte de temps et gaspillage des ressources.

    PS Bien venu et bon courage pour la suite.

  3. #3
    Invité
    Invité(e)
    Par défaut
    Merci pour ta réponse. Techniquement, je ne pense pas que l'on puisse récupérer un tableau de varchar2 mais bon, comme tu le dis, il va falloir que je passe un peu plus de temps sur Oracle. Pour ce faire, j'ai pris la dernière version du livre "sql pour oracle". Reste à lire et surtout pratiquer ^^.

    Merci en tout cas et bonne journée.

    PS: j'ai installé la version XE de Oracle. Est ce suffisant pour se plonger dans le monde des fonctions/triggers/sequences/procédures/packages/... ?

  4. #4
    Expert éminent sénior Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2007
    Messages : 5 611
    Points : 11 252
    Points
    11 252
    Par défaut
    Citation Envoyé par anaia Voir le message
    ...Techniquement, je ne pense pas que l'on puisse récupérer un tableau de varchar2
    L'idée est d'utiliser un RecordSet coté java pour traiter le curseur envoyé par la fonction comme si une requête aurait été exécutée.

  5. #5
    Invité
    Invité(e)
    Par défaut
    Je vais faire des recherches sur le recordset et les curseurs. Merci pour l'aide.

  6. #6
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    2 947
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 2 947
    Points : 5 846
    Points
    5 846
    Par défaut
    Regarde Fonction qui retourne un curseur pour la partie PL/SQL.
    PS: j'ai installé la version XE de Oracle. Est ce suffisant pour se plonger dans le monde des fonctions/triggers/sequences/procédures/packages/... ?
    Oui

  7. #7
    Invité
    Invité(e)
    Par défaut
    Merci à tous les deux. Du coup, j'ai fait une fonction et une procédure qui récupèrent deux lignes grâce à vos informations. Je vais mettre un petit résumé des codes si il y a des personnes qui ont le même problème :

    NOTE:
    Dans la partie java, je fais une itération et je rajoute les valeurs au fur et à mesure dans une variable de type String (f pour fonction et p pour procédure). Pour information, ce code correspond à des tests donc ne soyez pas choqué du fait des noms des variables.

    -------------COTE FONCTION-----------------


    PARTIE PL/SQL :


    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    create or replace 
    function lolaget return sys_refcursor is
    ls sys_refcursor;
    begin
     OPEN LS FOR SELECT nom||' '||prenom  FROM LOLATEST;
      return LS;
    end lolaget;

    RECUPERATION VIA JAVA:


    Code Java : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
     String f = "";
     String ordreSQL = "{? = call lolaget()}";
     CallableStatement stmt = conn.prepareCall(ordreSQL);
     
     // Affectation de valeurs pour les champs paramétrables
     stmt.registerOutParameter(1, OracleTypes.CURSOR);		    		  
     stmt.execute();
     ResultSet rs = (ResultSet) stmt.getObject(1);
    	 while(rs.next())
             {
    	    f = f + "<br/>"+rs.getString(1);
             }
    	  stmt.close();


    -------------COTE PROCEDURE-----------------

    PARTIE PL/SQL :


    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    create or replace 
    procedure LOLAGETP (ls out sys_refcursor) AS
    begin
         OPEN ls FOR SELECT prenom||' '||nom  FROM LOLATEST;
    end;

    RECUPERATION VIA JAVA:


    Code Java : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     
      String p = "";
     String ordreSQLB                 = "BEGIN LOLAGETP(?); END;";
     CallableStatement stmtB = conn.prepareCall(ordreSQLB);
     
      // Affectation de valeurs pour les champs paramétrables
      stmtB.registerOutParameter(1,OracleTypes.CURSOR);
      stmtB.execute();
     
    ResultSet rsB = (ResultSet) stmtB.getObject(1);
    	while(rsB.next())
            {
    	    p = p + "<br/>"+rsB.getString(1);
    	 }
     stmtB.close();

    En tout cas merci pour les informations et n'hésitez pas à donner vos avis si c'est simplifiable.
    Dernière modification par Waldar ; 21/03/2013 à 13h56. Motif: Précision code dans balise

Discussions similaires

  1. Réponses: 7
    Dernier message: 25/03/2011, 10h52
  2. Réponses: 4
    Dernier message: 15/10/2009, 13h33
  3. [XL-2007] Afficher une checkbox dans une feuille si une checkbox d'une autre feuille est cochée
    Par JessieCoutas dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 18/08/2009, 13h35
  4. Envoyer une formulaire dans une page dans une Frame
    Par zooffy dans le forum Balisage (X)HTML et validation W3C
    Réponses: 5
    Dernier message: 29/06/2007, 10h13
  5. Recherche une valeur d'une cellule dans une colonne d'une autre feuille
    Par kourria dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 21/06/2007, 13h48

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