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 :

Faire un SELECT IN en utilisant un tableau de record


Sujet :

PL/SQL Oracle

  1. #1
    Membre habitué
    Inscrit en
    Septembre 2004
    Messages
    378
    Détails du profil
    Informations forums :
    Inscription : Septembre 2004
    Messages : 378
    Points : 130
    Points
    130
    Par défaut Faire un SELECT IN en utilisant un tableau de record
    Bonjour

    J'ai un tableau de record défini comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    TYPE rec_compagies IS RECORD (
    code_etab VARCHAR2(5),
    nom_etab VARCHAR2(100)....
    );
    TYPE typ_compagies IS TABLE OF rec_compagies INDEX BY VARCHAR2(10);
    tab_companies          typ_compagies ;
    Ce tableau est alimenté correctement. Et par la suite, je voudrais pouvoir faire une requête dans une table en utilisant tous les code_etab présents dans le tableau, quelque chose comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT ... FROM table WHERE id IN (tab_companies.code_etab)
    Est-ce faisable ? Comment puis-je procéder ?
    Merci de votre aide

  2. #2
    McM
    McM est déconnecté
    Expert éminent

    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Juillet 2003
    Messages
    4 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Juillet 2003
    Messages : 4 580
    Points : 7 740
    Points
    7 740
    Billets dans le blog
    4
    Par défaut
    Tu peux utiliser une fonction pipelined http://sheikyerbouti.developpez.com/...age=Chap4#L4.4 si ton type de tableau est basé.
    En virant le paramètre utilisé dans le tuto qui sera inutile dans ton cas, car ta fonction lira directement le tableau
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CURSOR(Select * from EMP)
    More Code : More Bugs. Less Code : Less Bugs
    Mon Blog PL/Sql : Fichier Zip / Image BMP / Lire sqliteDB / QRCode et Images PNG ou BMP

  3. #3
    Membre habitué
    Inscrit en
    Septembre 2004
    Messages
    378
    Détails du profil
    Informations forums :
    Inscription : Septembre 2004
    Messages : 378
    Points : 130
    Points
    130
    Par défaut
    Merci pour la réponse
    Grâce au lien, j'ai pu créer une fonction pipelined mais ça ne marche toujours pas.

    Le type utilisé est indexé sur du VARCHAR2
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    TYPE typ_compagies IS TABLE OF rec_compagies INDEX BY VARCHAR2(10);
    Et j'ai l'erreur de compilation :
    PLS-00630: pipelined functions must have a supported collection return type
    En enlevant la partie INDEX
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    TYPE typ_compagies IS TABLE OF rec_compagies INDEX BY VARCHAR2(10);
    ca compile.
    Mais le code ne s'exécute plus car le code est basé sur un type index sur VARCHAR2.

  4. #4
    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
    Il y a deux (en fait trois) moteurs dans la base Oracle: SQL et PL/SQL. Le type record n'existe qu'en PL/SQL donc le moteur SQL ne peut pas l'utiliser. La solution habituelle consiste dans l'utilisation d'un Type utilisateur définie dans la base (create Type ...). De cette manière le moteur SQL et PL/SQL ont accès à ce type et il peuvent l'échanger.
    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
     
    Connected to Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 
    Connected as mni@parvatI
     
    SQL> 
    SQL> create or replace type emp_typ as object (
      2    empno           number(6),
      3    ename           varchar2(10),
      4    job             varchar2(9),
      5    deptno          number(2)
      6  )
      7  /
    Type created
    SQL> create or replace type emp_typ_nt As table of emp_typ
      2  /
    Type created
    SQL> set serveroutput on
    SQL> Declare
      2    l_emp_nt  emp_typ_nt;
      3  Begin
      4    Select emp_typ(empno,
      5           ename,
      6           job,
      7           deptno)
      8      Bulk Collect Into l_emp_nt
      9      From emp;
     10    --
     11    For recDept In (Select d.dname
     12                      from dept d
     13                     Where d.deptno In (Select deptno
     14                                          From Table(l_emp_nt)
     15                                      )
     16                   )
     17    Loop
     18      dbms_output.put_line(recDept.dname);
     19    End Loop;
     20  End;
     21  /
    ACCOUNTING
    RESEARCH
    SALES
    PL/SQL procedure successfully completed
     
    SQL>

  5. #5
    Membre habitué
    Inscrit en
    Septembre 2004
    Messages
    378
    Détails du profil
    Informations forums :
    Inscription : Septembre 2004
    Messages : 378
    Points : 130
    Points
    130
    Par défaut
    OK merci
    Avant de tester, je voudrais savoir si ca n'est pas possible de définir emp_typ et emp_typ_nt dans un package ?

    Et est-ce que je peux garder le tableau indéxé avec du VARCHAR2 ?

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

    Informations forums :
    Inscription : Août 2008
    Messages : 2 947
    Points : 5 846
    Points
    5 846
    Par défaut
    Citation Envoyé par Hobbi1 Voir le message
    Avant de tester, je voudrais savoir si ca n'est pas possible de définir emp_typ et emp_typ_nt dans un package ?
    Citation Envoyé par mnitu Voir le message
    Il y a deux (en fait trois) moteurs dans la base Oracle: SQL et PL/SQL. Le type record n'existe qu'en PL/SQL donc le moteur SQL ne peut pas l'utiliser. La solution habituelle consiste dans l'utilisation d'un Type utilisateur définie dans la base (create Type ...). De cette manière le moteur SQL et PL/SQL ont accès à ce type et il peuvent l'échanger.

  7. #7
    Membre habitué
    Inscrit en
    Septembre 2004
    Messages
    378
    Détails du profil
    Informations forums :
    Inscription : Septembre 2004
    Messages : 378
    Points : 130
    Points
    130
    Par défaut
    J'ai testé sans l'index avec du VARCHAR2 et ça marche.
    Donc ca me va très bien

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

Discussions similaires

  1. Faire un SELECT avec un tableau
    Par kinaï dans le forum MS SQL Server
    Réponses: 5
    Dernier message: 07/10/2007, 21h35
  2. Utiliser un tableau de résultat pour faire une jointure
    Par Xavier1979 dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 13/06/2007, 14h27
  3. Faire un Select v1 sans mettre v1 dans Group By
    Par faayy dans le forum Langage SQL
    Réponses: 6
    Dernier message: 12/05/2005, 10h28
  4. [XHTML] Utilisation de Tableau en XHTML
    Par Kerod dans le forum Balisage (X)HTML et validation W3C
    Réponses: 2
    Dernier message: 02/04/2005, 12h23
  5. faire un selection dans une image aves les APIs
    Par merahyazid dans le forum C++Builder
    Réponses: 3
    Dernier message: 30/04/2002, 11h44

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