Précédent   Forum des professionnels en informatique > Bases de données > Oracle > PL/SQL
PL/SQL Forum d'entraide sur le PL/SQL
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 02/08/2011, 15h17   #1
Invité régulier
 
Inscription : janvier 2007
Messages : 18
Détails du profil
Informations forums :
Inscription : janvier 2007
Messages : 18
Points : 9
Points : 9
Par défaut Récupérer plusieurs valeurs

bonjour,
je recherche comment récuperer plus d'1 valeur en retour dans un package/package body sous Oracle developer 1.2.1 soit par function ou par cursor en PL/SQL.
la déclaration objet n'est pas acceptée.
exemple : à partir d'un code postal, valeurs retournées Departement, ville
Merci de votre aide.
MarcLa est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/08/2011, 15h52   #2
Rédacteur/Modérateur
 
Avatar de orafrance
 
Inscription : janvier 2004
Messages : 15 861
Détails du profil
Informations personnelles :
Âge : 34

Informations forums :
Inscription : janvier 2004
Messages : 15 861
Points : 16 212
Points : 16 212
Pourquoi ne pas créer une procédure avec 2 paramètres de type OUT ?

Sinon, tu peux retourner un TYPE créer préalablement, cf http://forums.oracle.com/forums/thre...hreadID=428977

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
DECLARE
  TYPE t_myresult IS RECORD (myres1 number, myres2 number);
  myresult   t_myresult;
 
  x number := 10;
  y number := 3;
 
  FUNCTION myfunc (p_val1 IN NUMBER, p_val2 IN NUMBER) RETURN t_myresult IS
    v_res t_myresult;
  BEGIN
    v_res.myres1 := ROUND(p_val1 / p_val2);
    v_res.myres2 := p_val1 - (v_res.myres1 * p_val2);
    RETURN v_res;
  END;
BEGIN
  myresult := myfunc(x,y);
  DBMS_OUTPUT.PUT_LINE('X='||x||'; Y='||y||'; X/Y='||myresult.myres1||' remainder '||myresult.myres2);
END;
orafrance est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/08/2011, 16h31   #3
Invité régulier
 
Inscription : janvier 2007
Messages : 18
Détails du profil
Informations forums :
Inscription : janvier 2007
Messages : 18
Points : 9
Points : 9
Merci pour la réponse, cela fonctionne.
Mais pour inclure dans un package :
je mets dans le package les déclarations de type et de function
dans le body la function
, je compile sans erreur, mais quand je je lance le select pour récupérer les valeurs, j'ai l'erreur :
identificateur non valide
j'ai du passer à coté de quelquechose ?
MarcLa est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/08/2011, 21h22   #4
McM
Expert Confirmé Sénior
 
Inscription : juillet 2003
Messages : 3 437
Détails du profil
Informations forums :
Inscription : juillet 2003
Messages : 3 437
Points : 4 173
Points : 4 173
avec le code on pourra t'aider.
__________________
More Code : More Bugs. Less Code : Less Bugs
McM est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/08/2011, 10h58   #5
Invité régulier
 
Inscription : janvier 2007
Messages : 18
Détails du profil
Informations forums :
Inscription : janvier 2007
Messages : 18
Points : 9
Points : 9
voici le code :
la compilation du package se passe bien.
je devrais utiliser un cursor plutot qu' une fonction ?

merci de votre aide.

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
CREATE OR REPLACE package P1 IS
 
--fonction Dept_ESO : retourne le n° de dept et le libelle de l'Etab
 
type DeptEso IS record ( Departement varchar2(2), Libelle_Etab varchar2(32)); 
 
FUNCTION Dept_ESO (xEtab varchar2) RETURN DeptEso;
 
end P1;
 
 
 
 
 
 
CREATE OR REPLACE package body P1 IS
 
/*
--=====Departement de l'ESO====
*/
 
FUNCTION Dept_ESO (xEtab varchar2) RETURN DeptEso IS r DeptEso;
begin
 SELECT substr(mgadr.MGADR_CODPOS, 1, 2), 
        paesi.paesi_lib                 
 FROM paesi, paead, mgadr
 WHERE paesi.paesi_codext = xEtab
 AND paead.paesi_num = paesi.paesi_num
 AND mgadr.mgadr_num = paead.mgadr_num;
 
RETURN r;
 
end Dept_ESO;
 
end P1;
MarcLa est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/08/2011, 13h13   #6
McM
Expert Confirmé Sénior
 
Inscription : juillet 2003
Messages : 3 437
Détails du profil
Informations forums :
Inscription : juillet 2003
Messages : 3 437
Points : 4 173
Points : 4 173
Si tu n'as qu'une seule ligne, non, pas de curseur.
Par contre un select en plsql doit toujours être into quelque chose.
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
FUNCTION Dept_ESO (xEtab varchar2) RETURN DeptEso IS 
r DeptEso;
begin
 SELECT substr(mgadr.MGADR_CODPOS, 1, 2), paesi.paesi_lib                 
INTO r.departement, r.Libelle_Etab
 FROM paesi, paead, mgadr
 WHERE paesi.paesi_codext = xEtab
 AND paead.paesi_num = paesi.paesi_num
 AND mgadr.mgadr_num = paead.mgadr_num;
 
RETURN r;
 
end Dept_ESO;
__________________
More Code : More Bugs. Less Code : Less Bugs
McM est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/08/2011, 09h54   #7
Invité régulier
 
Inscription : janvier 2007
Messages : 18
Détails du profil
Informations forums :
Inscription : janvier 2007
Messages : 18
Points : 9
Points : 9
bonjour,
merci pour vos réponses.
la dernière question : comment dans le package, créer une procédure qui fait appel à la fonction pour insérer dans une table le Dept et le libellé ?

d'avance merci et bon week end.
MarcLa est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 10h22.


 
 
 
 
Partenaires

Hébergement Web