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

Oracle Discussion :

Pipe row


Sujet :

Oracle

  1. #1
    Membre régulier
    Homme Profil pro
    Inscrit en
    Novembre 2009
    Messages
    80
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2009
    Messages : 80
    Points : 74
    Points
    74
    Par défaut Pipe row
    Bonjour.
    J'ai une fonction qui retourne un tableau à deux dimensions, pour chaque itération i, elle retourne une ligne du tableau et en fin de compte, je dois avoir une matrice (à deux dimensions) en faisant une boucle sur i allant de 1 à tableau.count et après avoir récupéré les données dans la ligne i, je les insère:
    PIPE ROW(nomDuPackage.montableau(i));
    Le problème est que je n'obtiens qu'une seule ligne, c'est à dire il n'y a pas incrémentation de i malgré que la boucle est bonne du point de vue syntaxe et même si j'incrémente la variable i comme suit : i:=i+1 avant LOOP, je n'obtiens pas d'autres lignes et j'ai un message bizarre : aucune donnée requise.
    Ceci dit, j'ai bien d'autres données dans les autres lignes.
    Est-ce que quelqu'un a une idée ?
    Merci d'avance.

  2. #2
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2010
    Messages
    412
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 412
    Points : 807
    Points
    807
    Par défaut
    Bonjour,

    J'ai pas bien compris l'ensemble du message.

    Par contre, pour la partie en rapport avec le message etrange, ben il est pas etrange en fait. C'est une "erreur" levee par une fonction pipelined lorsque le programme appelant n'as plus besoin de lignes. J'ai mis "erreur", parce que ce n'est pas bloquant et meme pas signale, sauf si on le demande.
    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
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    TMP@MINILHC >create or replace function tmp_func return number_tt pipelined is
      2  begin
      3     for i in 1..20 loop
      4        pipe row(i);
      5     end loop;
      6  exception when others then
      7     dbms_output.put_line(SQLERRM);
      8     raise;
      9  end;
     10  /
     
    Function created.
     
    Elapsed: 00:00:00.01
    TMP@MINILHC >show errors
    No errors.
    TMP@MINILHC >select * from table(tmp_func) where rownum<10;
     
    COLUMN_VALUE
    ------------
               1
               2
               3
               4
               5
               6
               7
               8
               9
     
    9 rows selected.
     
    ORA-06548: aucune autre ligne requise
    Elapsed: 00:00:00.05
    TMP@MINILHC >select * from table(tmp_func) ;
     
    COLUMN_VALUE
    ------------
               1
               2
               3
               4
               5
               6
               7
               8
               9
              10
              11
              12
              13
              14
              15
              16
              17
              18
              19
              20
     
    20 rows selected.
     
    Elapsed: 00:00:00.08
    Dans le premier cas, et parce que j'ai demande le message d'erreur via DBMS_OUTPUT, on a l'erreur. Dans le second cas, rien du tout. Vous pouvez remarquer que le raise ne fais rien du tout, c'est pas une erreur bloquante.

    Quand au reste de votre message, va falloir faire des efforts:
    Code (avec les balises qui vont bien), et resultat attendu.

  3. #3
    Membre régulier
    Homme Profil pro
    Inscrit en
    Novembre 2009
    Messages
    80
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2009
    Messages : 80
    Points : 74
    Points
    74
    Par défaut
    Bonjour.
    Merci d'avoir répondu.
    Voici un morceau du code :
    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
    26
    27
     
    CREATE OR REPLACE PACKAGE BODY monpackage IS
    FUNCTION maFontion  RETURN STR_VL pipelined
    IS
    variable                   maTable.maColonne%TYPE;
    CURSOR curseur is select VAL_ID into variable from maTable where ...;
     
    BEGIN
    monpackage.monTatbleau.DELETE;
    monpackage.monTatbleau.extend(100);
     
    OPEN curseur;
    FOR i IN 1..monTableau.count
    LOOP
       monpackage.monTatbleau(i).Variable := variable;
       PIPE ROW(monpackage.monTatbleau(i));
    END LOOP;
    CLOSE curseur;
    return;
    EXCEPTION
        WHEN No_DATA_FOUND
            THEN DBMS_OUTPUT.put_line (SQLERRM);
        WHEN NO_DATA_NEEDED
            THEN
            DBMS_OUTPUT.put_line (SQLERRM);
          RETURN;
    END maFontion;
    je voudrai afficher toutes les valeurs du tableau, or je n'obtiens que l'affichage pour i=1 et puis exception que je n'attendais pas :
    i = 1
    ORA-06548: aucune autre ligne requise.

    Merci de votre réponse.

  4. #4
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2010
    Messages
    412
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 412
    Points : 807
    Points
    807
    Par défaut
    Presque, vous avez fait cite, au lieu d'utiliser la balise code. C'est le symbole # (pas intuitif mais bon), lorsque vous ecrivez un message il est a droite de la barre ou vous pouvez mettre en gras, etc.

    Il y a votre fonction (il doit manquer plein de morceaux parce que la c'est incoherent). Maintenant, votre fonction vous l'appelez comment?

    Concernant le "aucune autre ligne requise", vous demandez vous meme l'affichage via votre exception when no_data_needed. Ou sinon, relisez mon exemple avec les deux select.

    Vu le message d'erreur, AMHA, vous ne demandez pas toutes les lignes de votre fonction pipelined.

  5. #5
    Membre régulier
    Homme Profil pro
    Inscrit en
    Novembre 2009
    Messages
    80
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2009
    Messages : 80
    Points : 74
    Points
    74
    Par défaut
    Merci de votre réponse.
    En fait, je fais appel via une procédure stockée comme suit :
    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
     
    PROCEDURE maProcedure(
        temp_cv OUT monPackage.cur_resultset
     )
    AS
       rc monPackage.STR_VAL;
     
    BEGIN
     
       OPEN temp_cv FOR SELECT variable AS "VARIABLE" 
       FROM TABLE(monPackage.maFonction);
     
    EXCEPTION
       WHEN OTHERS
       THEN
          DBMS_OUTPUT.put_line (SQLERRM);
          RETURN;
    END maProcedure;
    Concernant l'affichage, je les affiche avant le PIPE ROW dans maFonction en mode debug via :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    DBMS_OUTPUT.put_line('variable = '||variable);
    DBMS_OUTPUT.put_line ('i = '||i);
    Merci de votre aide.

  6. #6
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2010
    Messages
    412
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 412
    Points : 807
    Points
    807
    Par défaut
    Et temp_cv, vous en faites quoi?

  7. #7
    Membre régulier
    Homme Profil pro
    Inscrit en
    Novembre 2009
    Messages
    80
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2009
    Messages : 80
    Points : 74
    Points
    74
    Par défaut
    Merci bien.
    Dans l'entête de monPackage, je le déclare en tant que curseur comme suit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    TYPE cur_resultset IS REF CURSOR RETURN STR_VAL;
    et dans maProcedure, dans le corp du package, je l'ouvre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    OPEN temp_cv FOR SELECT variable AS "VARIABLE" 
       FROM TABLE(monPackage.maFonction);
    je dois mettre dedans les données.

    Merci bien de votre aide.

  8. #8
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2010
    Messages
    412
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 412
    Points : 807
    Points
    807
    Par défaut Doucement mais surement...
    Le NO_DATA_NEEDED, c'est pas un soucis dans la majorite des cas. Faut pas stresser la dessus.

    Je demandais l'utilisation du curseur. Si vous le fermez avant d'avoir utilise toutes les lignes, alors forcement il ne recupere pas toutes les lignes.

    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
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    TMP@MINILHC >CREATE OR REPLACE FUNCTION tmp_func RETURN number_tt pipelined IS
      2  begin
      3     FOR i IN 1..5 loop
      4        pipe row(i);
      5     end loop;
      6  exception when others then
      7     dbms_output.put_line(SQLERRM);
      8     raise;
      9  end;
     10  /
     
    Function created.
     
    Elapsed: 00:00:00.00
    TMP@MINILHC >
    TMP@MINILHC >create or replace package tmp_pkg is
      2  type cur_Result is ref cursor ;
      3  end;
      4  /
     
    Package created.
     
    Elapsed: 00:00:00.00
    TMP@MINILHC >show errors
    No errors.
    TMP@MINILHC >create or replace procedure tmp_proc(tmp_cv out tmp_pkg.cur_result) is
      2  begin
      3     open tmp_cv for select * from table(tmp_func);
      4  end;
      5  /
     
    Procedure created.
     
    Elapsed: 00:00:00.00
    TMP@MINILHC >show errors
    No errors.
    TMP@MINILHC >
    TMP@MINILHC >declare
      2     l_cur tmp_pkg.cur_result;
      3     a number;
      4  begin
      5     dbms_output.put_line('NO_DATA_NEEDED parce qu'' on ne demande qu''une seule ligne');
      6     tmp_proc(l_cur);
      7     fetch l_cur into a;
      8     dbms_output.put_line(a);
      9     close l_cur;
     10
     11     dbms_output.put_line('Avec un WHILE, pas de probleme de NO_DATA_NEEDED');
     12     tmp_proc(l_cur);
     13     loop
     14        fetch l_cur into a;
     15        exit when l_cur%notfound;
     16        dbms_output.put_line(a);
     17     end loop;
     18     close l_cur;
     19
     20  end;
     21  /
    NO_DATA_NEEDED parce qu' on ne demande qu'une seule ligne
    1
    ORA-06548: no more rows needed
    Avec un WHILE, pas de probleme de NO_DATA_NEEDED
    1
    2
    3
    4
    5
     
    PL/SQL procedure successfully completed.
    Dans le premier cas (lignes 42 a 45 et sortie ecran ligne 59 a 61), je ne vois pas tous les resultats de ma function pipelined. Mais c'est tout a fait normal, vu que je ne fais qu'un fetch et qu'apres je ferme le curseur.

  9. #9
    Membre régulier
    Homme Profil pro
    Inscrit en
    Novembre 2009
    Messages
    80
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2009
    Messages : 80
    Points : 74
    Points
    74
    Par défaut
    Merci bien.
    La procédure est cencée retourner un tableau de données à deux dimensions pour les récupérer en java dans une boucle while :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    getGestionBDD().executeProc(GestionBDD.maProcedure,mapEntree,mapSortie);
    OracleResultSet o = (OracleResultSet) mapSortie.values().iterator().next();
    while(o.next()){
    ...
    }
    Merci.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Utilisation de PIPE ROW avec un dump
    Par jeunedebutantJ2ee dans le forum PL/SQL
    Réponses: 0
    Dernier message: 05/09/2011, 16h49
  2. PIPE ROW, Comment çà marche ?
    Par patmaba dans le forum PL/SQL
    Réponses: 3
    Dernier message: 26/09/2008, 12h21
  3. Réponses: 3
    Dernier message: 21/08/2003, 15h47
  4. Problème : bloquage d'un pipe
    Par Nicaisse dans le forum POSIX
    Réponses: 10
    Dernier message: 24/07/2003, 12h06
  5. Row lock
    Par cassandra dans le forum SQL Procédural
    Réponses: 4
    Dernier message: 09/04/2003, 17h07

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