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 :

Function avec table of en retour


Sujet :

PL/SQL Oracle

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juin 2012
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2012
    Messages : 9
    Points : 5
    Points
    5
    Par défaut Function avec table of en retour
    Bonjour,
    j'ai écrit une fonction qui renvoie un tableau de type table of.
    mais voila impossible de trouver la syntaxe de déclaration pour le create or replace function X return ....
    j'ai fouiller le forum et j'ai trouvé une solution qui consiste a creer un type objet de mon tableau.et de le passer en parametre.
    mais n'y a t'il pas plus propre?ne peut t'on pas tout simplement renvoyé un tableau que l'on déclarer dans la fonction?

    voici le tableau que j'aimerai renvoyé
    type ListeTripId is table of trips.trip_id %type index by Binary_integer;
    Tab ListeTripId;


    merci d'avance pour vos réponse

  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
    Je ne comprends pas vraiment quelle est votre problème, néanmoins voici un exemple d'une fonction qui renvoie un tableau
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    Create Or Replace Package pkg_t Is
      type EmployeeId is table of employees.employee_id%type index by Binary_integer;
      Function foo(
        department_id       In employees.department_id%Type
      ) Return EmployeeId;
    End;

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juin 2012
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2012
    Messages : 9
    Points : 5
    Points
    5
    Par défaut
    ok,donc je doit passer par un package?
    je ne maitrise pas cela encore.je vais lire le tuto dessus et testé.
    merci de ta réponse

  4. #4
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juin 2012
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2012
    Messages : 9
    Points : 5
    Points
    5
    Par défaut
    J'ai lu le cours sur les package ,j'ai donc crée un package avec une seul fonction et type personnalisé.
    j'ai codé le corps de package.pas d'erreur a la compilation.
    je veux test le resultat via une procédure,et la impossible.Oracle me dit:expression du mauvais type sur mon appel de fonction.
    pourtant les parametre d'appel et de retour me semble bon...pourquoi?

    voici le code executé:
    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
    CREATE OR REPLACE PACKAGE Pkg_test IS
        -- Variables globales et publiques
       type ListeTripId is table of trips.trip_id %type index by Binary_integer;
     
        -- Fonctions publiques
       FUNCTION foo(jour IN number) RETURN ListeTripId;
     
    End Pkg_test ;
     
    CREATE OR REPLACE Package Body pkg_test IS
     
      --fonction public
      FUNCTION foo(jour IN number) RETURN ListeTripId is
        type ref_curs is ref cursor;
        c1 ref_curs;
        Tab ListeTripId;
        ligne trips %rowtype;
        i number;
     
        begin  
          if(jour=0) then
          open c1 for select * from trips where service_id in (select service_id from calendar where Monday=1);
          elsif (jour=1) then
          open c1 for select * from trips where service_id in (select service_id from calendar where Thursday=1);
          else
    	open c1 for select * from trips where service_id in (select service_id from calendar where wednesday=1);
          end if;
    	fetch c1 into ligne;
    	i:=0;
    	while c1%found loop
    	  Tab(i):=ligne.trip_id;
    	  i:=i+1;
    	  dbms_output.put_line(ligne.trip_id);
    	  fetch c1 into ligne;
    	end loop;
          close c1;
          return (Tab); --je renvoie la variable de type ListeTripId
       end foo;
     
    end pkg_test;
     
    --procedure de test
    create or replace Procedure testPck is
       type ListeTripId is table of trips.trip_id %type index by Binary_integer;
       Tab ListeTripId;
    begin
      Tab:=pkg_test.foo(1); --erreur sur cette ligne
      dbms_output.put_line('OK');
    end;

  5. #5
    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
    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
     
    Connected to Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 
    Connected as mni
     
    SQL> 
    SQL> CREATE OR REPLACE Package Body pkg_t IS
      2    FUNCTION foo(
      3      department_id       IN employees.department_id%Type
      4    ) RETURN EmployeeId
      5    Is
      6      Emps  EmployeeId;
      7    Begin
      8      Select employee_id
      9        Bulk Collect Into Emps
     10        From employees e
     11       Where e.department_id = foo.department_id;
     12      --
     13      Return Emps;
     14    End;
     15  End;
     16  /
     
    Package body created
     
    SQL> set serveroutput on
    SQL> 
    SQL> Declare
      2    Emps  pkg_t.EmployeeId;
      3  Begin
      4    Emps := pkg_t.foo(50);
      5    --
      6    Dbms_Output.put_line('Count='||Emps.Count());
      7  End;
      8  /
     
    Count=45
     
    PL/SQL procedure successfully completed
     
    SQL>

  6. #6
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juin 2012
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2012
    Messages : 9
    Points : 5
    Points
    5
    Par défaut
    yep super grace a toi j'ai résolut le probleme.
    lorsque je déclarait la variable lors de la procedure de test ,je devait al definir nompackage.typevariable et non pas que typevariable.
    merci beaucoup de ton aide

  7. #7
    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
    Super ! A retenir :
    • Il faut un package si le type tableau est associative array (avant Oracle 12c). Pour les types nested table et ou varray le type peut être définie au niveau d’un schéma. De même le type associative array ne peut être utilise qu’en PL/SQL par rapport aux autres qui sont accessibles au niveau du moteur SQL également.
    • Si le tableau un provient d’une requête comme dans mon exemple il est plus efficace d’utiliser un ref cursor en sortie de la fonction qu’un tableau.

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

Discussions similaires

  1. Question sur les fonctions avec "TABLE" comme param. de retour
    Par Alex01 dans le forum Développement
    Réponses: 2
    Dernier message: 17/11/2008, 09h26
  2. une function avec un retour de function
    Par skillipo dans le forum VBA Access
    Réponses: 4
    Dernier message: 05/12/2007, 16h51
  3. function avec paramentre
    Par nicocsgamer dans le forum Général JavaScript
    Réponses: 7
    Dernier message: 21/09/2005, 09h31
  4. Réponses: 3
    Dernier message: 11/01/2005, 08h20
  5. [Sybase] Pb avec tables proxy
    Par vince120 dans le forum Sybase
    Réponses: 4
    Dernier message: 10/12/2004, 14h11

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