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 :

Fonction retournant une liste de valeurs


Sujet :

PL/SQL Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4
    Par défaut Fonction retournant une liste de valeurs
    Bonjour,
    j'ai besoin d'obtenir une liste de valeurs de 2 colonnes via une fonction qui sera exécutée dans un select (donc pas de paramètre out dans la fonction)

    J'ai donc pensé déclarer un type de Record dans un package et l'ai utilisé en type de retour de la fonction mais le select suivant me retourne un invalid datatype:
    select oma_maint.oma_maintenance(30613,'PARAMETER21') from dual

    la fonction oma_maintenance doit me retouner le résultat suivant:
    column1 , column2
    100 , toto
    200 , titi

    soit 2 lignes.

    voici mon package,

    create or replace
    PACKAGE OMA_MAINT AS
    TYPE value_record IS RECORD( value1_type VARCHAR2(200)
    ,value2_type VARCHAR2(200)
    );
    TYPE value_list IS TABLE OF value_record INDEX BY binary_integer;

    FUNCTION OMA_MAINTENANCE (p_reqid IN NUMBER,
    p_parameter_name IN VARCHAR2)
    RETURN value_list;
    END OMA_MAINT;

    le body simplifié du package
    create or replace
    PACKAGE BODY OMA_MAINT AS

    FUNCTION OMA_MAINTENANCE (
    p_reqid IN NUMBER,
    p_parameter_name IN VARCHAR2
    ) RETURN value_list AS


    l_list value_list;
    l_parameter_number VARCHAR2(20);
    l_valeur varchar2(100);
    l_request_number number;
    l_application VARCHAR2(100);

    BEGIN
    if length(p_parameter_name)>10 then
    l_parameter_number:= substr(p_parameter_name,length(p_parameter_name)-1,2);
    else
    l_parameter_number:= substr(p_parameter_name,length(p_parameter_name),1);
    end if;


    case to_number(l_parameter_number)
    when 20 then
    l_valeur:='BR%';
    l_request_number:=1;
    when 21 then
    l_valeur:='GR%';
    l_request_number:=1;
    ----................................. j'ai supprimé des cases pour réduire la longueur du package

    else
    l_valeur:='0';
    l_request_number:=0;

    end case;

    case l_request_number
    when 1 then
    select security_group_id ,security_group_name
    bulk collect into l_list
    from KNTA_SECURITY_GROUPS
    where security_group_name like l_valeur
    and enabled_flag = 'Y'
    order by 2;

    ----................................. j'ai supprimé des cases pour réduire la longueur du package

    else

    l_list(1).value1_type := '0';l_list(1).value2_type := '0';

    end case;

    RETURN l_list;

    END OMA_MAINTENANCE;


    END;

    Le but est de retourner toujours 2 colonnes mais avec un nombre indéterminé de lignes. Et que cela soit disponible dans un select.
    Tout cela sans création d 'une table.
    Avez-vous une idée?
    MErci,

  2. #2
    Expert confirmé
    Avatar de SheikYerbouti
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    6 760
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 6 760
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Select to_char(col1), to_char(col2) From ...
    retournera aussi toujours 2 colonnes. Pourquoi vous ennuyer avec plus compliqué ?

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4
    Par défaut
    le select final dont j'ai besoin dépend de conditions. En fonction des ces conditions, j'utiliserai tel ou tel select. Or le select final est utilisé dans un ERP. Voci mon idée:
    1) j'appelle un select via l'erp dans lequel je passe 2 arguments (ReqID, et le nom d'une colonne d'une table d'Oracle:p_parameter_name )
    2) ce select appelle une fonction perso ORACLE qui en gère les arguments passés pou en sortir un résultat de 2 colonnes contenant n lignes.
    le nom de la colonne passé en paramètre (p_parameter_name) conditionne le résultat. En effet, en fonction de cette valeur, j'ai 2 case à effectuer.

    Voilà pourquoi, j'essaye d'utiliser une fonction. pourquoi dans un package, tout simplement pour déclarer un type Record et l'utilisé en retour de ma fonction.

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

    Informations forums :
    Inscription : Août 2008
    Messages : 2 954
    Par défaut
    Salut,

    Ta fonction retourne une collection, tu ne peux pas l'utiliser dans un select directement, pour ça regarde du côté des fonctions pipelined.

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4
    Par défaut
    je vais essayer cette solution. et on verra bien.

  6. #6
    Futur Membre du Club
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4
    Par défaut
    Tu as raison skuatamad, la fonction PIPELINED m'a sauvé la vie.
    J'ai attaché mon package qui fonctionne correctement au cas où une personne serait dans le même cas que moi et c'est un très bon exemple d'utilisation de PIPELINED
    Merci à tous pour vos réponses.
    Cordialement,
    Fichiers attachés Fichiers attachés

Discussions similaires

  1. Fonction retournant une liste
    Par zanzie dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 16/01/2013, 18h04
  2. function retournant une liste de valeurs
    Par maxidoove dans le forum SQL
    Réponses: 0
    Dernier message: 05/02/2008, 16h35
  3. Réponses: 5
    Dernier message: 09/12/2007, 18h17
  4. fonction (retourner une valeur)
    Par nymus7 dans le forum Langage
    Réponses: 8
    Dernier message: 03/09/2007, 13h22
  5. fonction retournant une valeur
    Par ryan dans le forum ASP
    Réponses: 4
    Dernier message: 06/09/2004, 17h45

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