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

Oracle Discussion :

Accéder au contenu d'une table imbriquée


Sujet :

Oracle

  1. #1
    Candidat au Club
    Inscrit en
    Décembre 2004
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 9
    Points : 2
    Points
    2
    Par défaut Accéder au contenu d'une table imbriquée
    Salut,
    j'ai un p'tit pb sur lequel je m'arrache les cheveux depuis deux jours.

    J'ai une table documents qui contient des infos sur des documents et un champs contenu qui est un objet et qui contient une table photos qui contient des BFile. je n'arrive pas à accéder au contenu de la table photos vu que l'unique colonne qu'elle contient n'ai pas nommée. Je pense qu'en modifiant la def du type photo en définissant un objet qui englobe le Bfile et en créant par la suite un type tableau de ce type j'aurais un nom de colonne mais je voudrais savoir s'il y a moyen d'accéder à la colonne autrement.

    Merci

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    create type photo as table of Bfile;
    /
     
    create type contenu as object(photos photo);
    /
     
    create table documents( ..., contenus contenu) 
    nested table contenus.photos store as tableofphotos;
    Balises code ajoutées par Orafrance

  2. #2
    Expert éminent sénior
    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
    Points : 11 862
    Points
    11 862
    Par défaut
    Votre ordre de création de table n'indique pas s'il s'agit d'une table objet ( CREATE TABLE ... OF type...) ou d'une table relationnelle.

    Qoui qu'il en soit, pour interroger votre collection, vous devez utiliser l'opérateur : TABLE

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT * FROM TABLE 
      ( 
       SELECT nom_colonne_collection FROM nom_table
       WHERE clause_sur pk_de_la_table
      ) ;

  3. #3
    Candidat au Club
    Inscrit en
    Décembre 2004
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 9
    Points : 2
    Points
    2
    Par défaut Accéder au contenu d'une table imbriquée
    En fait le problème vient du fait que je ne connais pas le nom de la colonne, et donc je ne peut pas faire de restriction pour n'afficher que les tuples qui répondent à un certain critère.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    SELECT * FROM TABLE 
      ( 
       SELECT nom_colonne_collection FROM nom_table 
       WHERE clause_sur pk_de_la_table 
      ) 
    WHERE condition sur les tuples de la table imbriquée;

  4. #4
    Expert éminent sénior
    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
    Points : 11 862
    Points
    11 862
    Par défaut Re: Accéder au contenu d'une table imbriquée
    Citation Envoyé par scott_tiger
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    create type photo as table of Bfile;
    /
     
    create type contenu as object(photos photo);
    /
     
    create table documents( ..., contenus contenu) 
    nested table contenus.photos store as tableofphotos;
    Balises code ajoutées par Orafrance
    Bien sûr que vous connaissez le nom de la colonne !
    Vous donnez les script dans votre post

    la table documents à une colonne de type collection nommée : contenus

  5. #5
    Candidat au Club
    Inscrit en
    Décembre 2004
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 9
    Points : 2
    Points
    2
    Par défaut Accéder au contenu d'une table imbriquée
    Contenu est le nom de la colonne dans la table documents qui contient la table photos moi je veux accéder à l'unique colonne de la table photos.

    Merci pour ta réponse.

  6. #6
    Expert éminent sénior
    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
    Points : 11 862
    Points
    11 862
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT * FROM TABLE 
      ( 
       SELECT CONTENUS FROM DOCUMENTS 
       WHERE NUM_DOCUMENT = 123 
      ) ;
    Vous ne donnez pas la structure de votre table : documents
    je ne peux donc pas vous aiguiller sur la pk à expliciter dans la clause where...

  7. #7
    Candidat au Club
    Inscrit en
    Décembre 2004
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 9
    Points : 2
    Points
    2
    Par défaut Accéder au contenu d'une table imbriquée
    Voici tout le code qui permet de créer les tables :

    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
     
     
    create type paragraphe as table of CLOB; 
    / 
     
    create type photo as table of BFILE; 
    / 
     
    create type lien as table of number; 
    / 
     
    create type contenus as object( 
     
    paragraphes paragraphe, 
     
    photos photo, 
     
    lienverdoc lien 
    ); 
    / 
     
    create table documents ( 
     
    numdoc number, 
     
    format varchar(20), 
     
    contenu contenus) 
     
    nested table contenu.paragraphes store as parag, 
    nested table contenu.photos store as pictures, 
    nested table contenu.lienverdoc store as links ;
    La requête que je dois écrire est :

    Rechercher pour un document donné (exemple: numdoc = 1) le nombre de fois où il est référencé dans les tables lienverdoc des autres documents.

    Merci.

  8. #8
    Expert éminent sénior
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 075
    Points
    19 075
    Par défaut
    avez-vous lu cette doc : http://download-west.oracle.com/docs/cd/B10501_01/appdev.920/a96624/05_colls.htm#20150

  9. #9
    Expert éminent sénior
    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
    Points : 11 862
    Points
    11 862
    Par défaut
    Je ne comprends pas pourquoi vous créez un objet qui contient les collection.

    Pourquoi ne pas créez la table avec directement les 3 collections ?

  10. #10
    Candidat au Club
    Inscrit en
    Décembre 2004
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 9
    Points : 2
    Points
    2
    Par défaut Accéder au contenu d'une table imbriquée
    Les trois collections sont indépendantes entre elles ne peuvent donc pas constituer les colonnes d'une même table.

  11. #11
    Expert éminent sénior
    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
    Points : 11 862
    Points
    11 862
    Par défaut
    Mais elles le sont, puisqu'elles sont stockée dans un objet qui est une colonne de la table.

    pourquoi ce niveau de complexité supplémentaire ?

  12. #12
    Candidat au Club
    Inscrit en
    Décembre 2004
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 9
    Points : 2
    Points
    2
    Par défaut Accéder au contenu d'une table imbriquée
    Chaque document a un contenu qui est composé d'un nombre quelconque de paragraphes de photos et de liens.
    Ce schéma n'est pas modifiable, je voudrais juste savoir s'i existe un moyen d'accéder au contenu de ces colonnes (qui n'ont pas de nom).
    Merci

  13. #13
    Expert éminent sénior
    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
    Points : 11 862
    Points
    11 862
    Par défaut
    Pourquoi persistez-vous à dire que ces colonnes n'ont pas de nom ?

    La table : documents posséde entre autre une colonne objet : contenu

    cet objet est composé de 3 collections ( paragraphes, photos et lienverdoc)

    paragraphes est une collection de CLOB, etc...

    en thérorie, donc, vos objets sont bien nommés

    documents.contenu.paragraphes pointe sur la collection paragraphes,
    documents.contenu.photos pointe sur la collection photos,
    etc.

    essayez-donc la syntaxe suivante :

    -- insertion d'une ligne --
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    insert into documents values ( 1, 'format', new contenus( paragraphe(null), photo(null), lien(10)) )
    -- interrogation de la table --
    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
    declare
      rec documents%rowtype ;
      cursor C (PN$Num in NUMBER)is
        select * into rec from documents where numdoc = PN$Num ;
    begin
      Open   C (1 ) ;
      Loop
        Fetch C into rec ;
        exit when C%notfound ;
    	For i in rec.contenu.lienverdoc.first .. rec.contenu.lienverdoc.last loop
    	   dbms_output.put_line( 'lien =' || rec.contenu.lienverdoc(i) ) ;
    	End loop ; 
      End loop ;
      Close C ;
    end;

  14. #14
    Expert éminent sénior
    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
    Points : 11 862
    Points
    11 862
    Par défaut
    Une autre syntaxe purement SQL :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    select t.numdoc, nt.* from documents t, table( select i.contenu.lienverdoc from documents i where numdoc = 1) nt
    where t.numdoc = 1

  15. #15
    Candidat au Club
    Inscrit en
    Décembre 2004
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 9
    Points : 2
    Points
    2
    Par défaut Accéder au contenu d'une table imbriquée
    Merci cette solution marche bien, cependant je ne vois pas comment l'exploiter directement en SQL sns passer par le PL/SQL.

  16. #16
    Expert éminent sénior
    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
    Points : 11 862
    Points
    11 862
    Par défaut Re: Accéder au contenu d'une table imbriquée
    Citation Envoyé par scott_tiger
    Merci cette solution marche bien, cependant je ne vois pas comment l'exploiter directement en SQL sns passer par le PL/SQL.
    et pourquoi non ?

  17. #17
    Candidat au Club
    Inscrit en
    Décembre 2004
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 9
    Points : 2
    Points
    2
    Par défaut Accéder au contenu d'une table imbriquée
    Pour accéder au contenu de la table lienverdoc par exemple il faut extraire la table avec l'opérateur THE (ou TABLE), et je ne sais pas accéder à un tuple particulier de cette table.
    Par exemple je ne sais pas répondre en SQL à la question :

    Quelles sont tous les documents qui ont un lien vers le document 1 (numdoc = 1), il faut accéder à toutes les tables lienverdoc de tous les documents et chercher le document 1 et je ne sais pas tester la valeur de chaque tuple de la table lienverdoc de chaque document.

  18. #18
    Expert éminent sénior
    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
    Points : 11 862
    Points
    11 862
    Par défaut
    pas de problème

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    -- Select des liens qui vallent 11 --
    select t.numdoc, nt.column_value 
    from documents t, table( select i.contenu.lienverdoc from documents i where numdoc = t.numdoc) nt
    where nt.column_value = 11
     
    -- Comptage --
    select count(*) 
    from documents t, table( select i.contenu.lienverdoc from documents i where numdoc = t.numdoc) nt
    where nt.column_value = 11

  19. #19
    Candidat au Club
    Inscrit en
    Décembre 2004
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 9
    Points : 2
    Points
    2
    Par défaut
    Merci beaucoup, c'est exactement ça que je voulait.

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

Discussions similaires

  1. accéder aux colonnes d'une table différemment
    Par fab_hendrix dans le forum Langage SQL
    Réponses: 3
    Dernier message: 06/08/2005, 20h20
  2. modifier le contenu d'une table avec innerHTML
    Par francon81 dans le forum Général JavaScript
    Réponses: 8
    Dernier message: 31/05/2005, 10h02
  3. comment effacer le contenu d'une table ttable
    Par naw dans le forum Bases de données
    Réponses: 4
    Dernier message: 07/07/2004, 17h13
  4. [MYSQL] Copier contenue d'une table vers...
    Par naseeb18 dans le forum Requêtes
    Réponses: 9
    Dernier message: 04/04/2004, 14h40
  5. Lister le contenu d'une table sans connaitre ses champs
    Par Google.be dans le forum PostgreSQL
    Réponses: 9
    Dernier message: 30/03/2004, 16h23

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