Précédent   Forum des professionnels en informatique > Bases de données > Oracle
Oracle Forum Oracle : le serveur, les outils, ... Voir F.A.Q Oracle Tutoriels Oracle
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 06/02/2012, 22h10   #1
Membre à l'essai
 
Homme
Inscription : novembre 2009
Messages : 39
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations forums :
Inscription : novembre 2009
Messages : 39
Points : 23
Points : 23
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.
Stephane75000 est déconnecté   Envoyer un message privé Réponse avec citation 01
Vieux 07/02/2012, 09h31   #2
Membre expérimenté
 
François
Inscription : février 2010
Messages : 306
Détails du profil
Informations personnelles :
Nom : François

Informations forums :
Inscription : février 2010
Messages : 306
Points : 537
Points : 537
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 :
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.
Rams7s est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/02/2012, 10h26   #3
Membre à l'essai
 
Homme
Inscription : novembre 2009
Messages : 39
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations forums :
Inscription : novembre 2009
Messages : 39
Points : 23
Points : 23
Bonjour.
Merci d'avoir répondu.
Voici un morceau du code :
Code :
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.
Stephane75000 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/02/2012, 10h40   #4
Membre expérimenté
 
François
Inscription : février 2010
Messages : 306
Détails du profil
Informations personnelles :
Nom : François

Informations forums :
Inscription : février 2010
Messages : 306
Points : 537
Points : 537
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.
Rams7s est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/02/2012, 10h48   #5
Membre à l'essai
 
Homme
Inscription : novembre 2009
Messages : 39
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations forums :
Inscription : novembre 2009
Messages : 39
Points : 23
Points : 23
Merci de votre réponse.
En fait, je fais appel via une procédure stockée comme suit :
Code :
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 :
1
2
DBMS_OUTPUT.put_line('variable = '||variable);
DBMS_OUTPUT.put_line ('i = '||i);
Merci de votre aide.
Stephane75000 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/02/2012, 11h11   #6
Membre expérimenté
 
François
Inscription : février 2010
Messages : 306
Détails du profil
Informations personnelles :
Nom : François

Informations forums :
Inscription : février 2010
Messages : 306
Points : 537
Points : 537
Et temp_cv, vous en faites quoi?
Rams7s est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/02/2012, 11h35   #7
Membre à l'essai
 
Homme
Inscription : novembre 2009
Messages : 39
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations forums :
Inscription : novembre 2009
Messages : 39
Points : 23
Points : 23
Merci bien.
Dans l'entête de monPackage, je le déclare en tant que curseur comme suit :

Code :
1
2
 
TYPE cur_resultset IS REF CURSOR RETURN STR_VAL;
et dans maProcedure, dans le corp du package, je l'ouvre
Code :
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.
Stephane75000 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/02/2012, 12h11   #8
Membre expérimenté
 
François
Inscription : février 2010
Messages : 306
Détails du profil
Informations personnelles :
Nom : François

Informations forums :
Inscription : février 2010
Messages : 306
Points : 537
Points : 537
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 :
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.
Rams7s est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/02/2012, 12h47   #9
Membre à l'essai
 
Homme
Inscription : novembre 2009
Messages : 39
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations forums :
Inscription : novembre 2009
Messages : 39
Points : 23
Points : 23
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 :
1
2
3
4
5
6
 
getGestionBDD().executeProc(GestionBDD.maProcedure,mapEntree,mapSortie);
OracleResultSet o = (OracleResultSet) mapSortie.VALUES().iterator().next();
while(o.next()){
...
}
Merci.
Stephane75000 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 01h46.


 
 
 
 
Partenaires

Hébergement Web