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

SQL Oracle Discussion :

Insertion dynamique dans nested table


Sujet :

SQL Oracle

  1. #1
    Candidat au Club
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Avril 2017
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Avril 2017
    Messages : 11
    Points : 2
    Points
    2
    Par défaut Insertion dynamique dans nested table
    Bonjour,

    j'ai créé une table de cette manière:

    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
    CREATE or replace TYPE BANNER_LIST AS TABLE OF NUMBER  
    /
     
    CREATE TABLE ADEXPR03.WEB_PLAN_MEDIA_MONTH_FRED
    (
        ID_MEDIA                    NUMBER(10,0)   NOT NULL,
        ID_PRODUCT                  NUMBER(10,0)   NOT NULL,
        MONTH_MEDIA_NUM             NUMBER(6,0)    NOT NULL,
        TOTALUNITE                  NUMBER(10,0)       NULL,
        LIST_BANNERS                BANNER_LIST     
    )
    NESTED TABLE LIST_BANNERS STORE AS WEB_PLAN_MEDIA_MONTH_TAB
    TABLESPACE DATAWEB01ADEXPR03
    NOLOGGING
    PCTFREE 10
    PCTUSED 0
    INITRANS 1
    MAXTRANS 255
    STORAGE(BUFFER_POOL DEFAULT)
    NOPARALLEL
    CACHE
    NOROWDEPENDENCIES
    /
    j'aurai quelques millions de lignes chaque jour à insérer du genre:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    insert into ADEXPR03.WEB_PLAN_MEDIA_MONTH
    SELECT
    DP.Id_media,
    DP.Id_product,
    SUBSTR(DP.Date_media_num,1,6) as M,
    SUM(INSERTION) as totalinsert,
    Wm_Concat(DISTINCT HASHCODE)
    FROM ADEXPR03.DATA_EVALIANT DP
    WHERE DP.DATE_MEDIA_NUM >= 20160101   and DP.DATE_MEDIA_NUM < 20160401
    and id_media=11366
    and id_product in (840239,838503,837806,835583,835570)
    GROUP BY DP.Id_Media, DP.Id_product, SUBSTR(DP.Date_media_num,1,6)
    order by 3,2
    ID_MEDIA	ID_PRODUCT	M	TOTALINSERT	WM_CONCAT(DISTINCTHASHCODE)
    11366	835570	        201601	9	        37147179
    11366	835583	        201601	7	       37152794,37209502,37212347,37498709,37498831
    11366	837806	        201601	1	       37085353
    11366	838503	        201601	3	       36807422,36807430,36808400
    11366	840239	        201601	3	       37152000,37152758
    11366	837806	        201602	1	       36940535
    11366	838503	        201602	6	       36807422,36808400
    11366	840239	        201602	1	       37152000
    11366	840239	        201603	1	       37415174

    actuellement, la colonne LIST_BANNERS est juste un VARCHAR2, mais le wm_concat prend 75% du temps à l'insertion.

    je voulais savoir si il était possible d'insérer dynamiquement en colonne les valeurs retournées par le wm_concat dans la table proposée plus haut.
    car je peux facilement insérer de cette manière :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    INSERT INTO ADEXPR03.WEB_PLAN_MEDIA_MONTH_FRED VALUES (11366,835570,201601,9,BANNER_LIST(37147179));
    INSERT INTO ADEXPR03.WEB_PLAN_MEDIA_MONTH_FRED VALUES (11366,835583,201601,7,BANNER_LIST(37152794,37209502,37212347,37498709,37498831));
    ...
    mais je voudrais que ce soit fait dans la requête d'insertion:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    insert into ADEXPR03.WEB_PLAN_MEDIA_MONTH_FRED
    SELECT
    DP.Id_media,
    DP.Id_product,
    SUBSTR(DP.Date_media_num,1,6) as M,
    SUM(INSERTION) as totalinsert,
    XXXXX(distinct HASHCODE)
    FROM ADEXPR03.DATA_EVALIANT DP
    WHERE DP.DATE_MEDIA_NUM >= 20160101   and DP.DATE_MEDIA_NUM < 20160401
    and id_media=11366
    and id_product in (840239,838503,837806,835583,835570)
    GROUP BY DP.Id_Media, DP.Id_product, SUBSTR(DP.Date_media_num,1,6)
    order by 3,2
    je ne vois pas comment faire cette insertion dans une nested table...

    Merci pour votre aide

  2. #2
    Membre expert
    Avatar de Sunchaser
    Homme Profil pro
    OPNI (Objet Programmant Non Identifié)
    Inscrit en
    Décembre 2004
    Messages
    2 059
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : OPNI (Objet Programmant Non Identifié)
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Décembre 2004
    Messages : 2 059
    Points : 3 204
    Points
    3 204
    Par défaut
    Bonjour,

    Je vois que personne n'a pour le moment répondu, donc je me permets de proposer humblement quelquechose, en espérant que cela puisse
    te mettre sur une piste.
    J'ai tenté un exemple, en espérant que tu pourras adapter a ton cas:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    CREATE OR REPLACE TYPE tab_tst_nested AS TABLE OF VARCHAR2 (50 CHAR);
     
    CREATE TABLE TST_NESTED
    (
      ROW_IDENTIFIER    INTEGER,
      COLLECTION_VALUE  TAB_TST_NESTED
    );
    puis
    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
     
    INSERT INTO TST_NESTED
       WITH base_data
               AS (SELECT 1 row_identifier, 'abc' for_collection FROM DUAL
                   UNION ALL
                   SELECT 1 row_identifier, 'def' for_collection FROM DUAL
                   UNION ALL
                   SELECT 1 row_identifier, 'ghi' for_collection FROM DUAL
                   UNION ALL
                   SELECT 1 row_identifier, 'jkl' for_collection FROM DUAL
                   UNION ALL
                   SELECT 2 row_identifier, 'abc2' for_collection FROM DUAL)
         SELECT MAX (a.row_identifier) row_identifier
              , CAST (MULTISET (SELECT for_collection
                                  FROM base_data
                                 WHERE row_identifier = a.row_identifier) AS tab_tst_nested)
                   for_collection
           FROM base_data a
          WHERE a.row_identifier = 1
       GROUP BY row_identifier;
    Ce qui veut dire que dans ton cas, il te faudra très certainement réorganiser ton code, et avoir à la place de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    XXXXX(distinct HASHCODE)
    quelque chose comme
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    CAST (MULTISET ( SELECT HASHCODE FROM ADEXPR03.DATA_EVALIANT WHERE --..., il te faut filtrer a nouveau
                ) AS BANNER_LIST) HASHCODE
    Ce n'est peut être pas la meilleure méthode.
    De mon côté, je n'ai jamais eu a passer par la, puisqu'a chaque fois que je devais insérer dans une Nested Table, c'était dans un
    contexte de PL/SQL.

    En espérant t'aider malgré tout,
    @+
    Aux persévérants aucune route n'est interdite.
    Celui qui ne sait pas se contenter de peu ne sera jamais content de rien.
    Current Status
    Avec 40% de pollinisateurs invertébrés menacés d'extinction selon les Nations Unies, l'homme risque fort de passer de la monoculture à la mono diète...
    Faîtes quelque chose de bien avec vos petits sous: Enfants du Mekong

  3. #3
    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
    Utilisez Collect mais vous avez quelques problèmes de compréhension des "nested tables" si vous utilisez wm_concat.

  4. #4
    Candidat au Club
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Avril 2017
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Avril 2017
    Messages : 11
    Points : 2
    Points
    2
    Par défaut
    Citation Envoyé par mnitu Voir le message
    Utilisez Collect mais vous avez quelques problèmes de compréhension des "nested tables" si vous utilisez wm_concat.
    je voudrais utiliser les nested tables au lieu de wm_concat...
    et en effet, les "collect" ne sont pas mon fort, d'où la demande d'aide...
    Merci.

  5. #5
    Candidat au Club
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Avril 2017
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Avril 2017
    Messages : 11
    Points : 2
    Points
    2
    Par défaut
    Citation Envoyé par Sunchaser Voir le message
    Bonjour,

    Je vois que personne n'a pour le moment répondu, donc je me permets de proposer humblement quelquechose, en espérant que cela puisse
    te mettre sur une piste.
    J'ai tenté un exemple, en espérant que tu pourras adapter a ton cas:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    CREATE OR REPLACE TYPE tab_tst_nested AS TABLE OF VARCHAR2 (50 CHAR);
     
    CREATE TABLE TST_NESTED
    (
      ROW_IDENTIFIER    INTEGER,
      COLLECTION_VALUE  TAB_TST_NESTED
    );
    puis
    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
     
    INSERT INTO TST_NESTED
       WITH base_data
               AS (SELECT 1 row_identifier, 'abc' for_collection FROM DUAL
                   UNION ALL
                   SELECT 1 row_identifier, 'def' for_collection FROM DUAL
                   UNION ALL
                   SELECT 1 row_identifier, 'ghi' for_collection FROM DUAL
                   UNION ALL
                   SELECT 1 row_identifier, 'jkl' for_collection FROM DUAL
                   UNION ALL
                   SELECT 2 row_identifier, 'abc2' for_collection FROM DUAL)
         SELECT MAX (a.row_identifier) row_identifier
              , CAST (MULTISET (SELECT for_collection
                                  FROM base_data
                                 WHERE row_identifier = a.row_identifier) AS tab_tst_nested)
                   for_collection
           FROM base_data a
          WHERE a.row_identifier = 1
       GROUP BY row_identifier;
    Ce qui veut dire que dans ton cas, il te faudra très certainement réorganiser ton code, et avoir à la place de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    XXXXX(distinct HASHCODE)
    quelque chose comme
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    CAST (MULTISET ( SELECT HASHCODE FROM ADEXPR03.DATA_EVALIANT WHERE --..., il te faut filtrer a nouveau
                ) AS BANNER_LIST) HASHCODE
    Ce n'est peut être pas la meilleure méthode.
    De mon côté, je n'ai jamais eu a passer par la, puisqu'a chaque fois que je devais insérer dans une Nested Table, c'était dans un
    contexte de PL/SQL.

    En espérant t'aider malgré tout,
    @+

    Très encourageant, je continue sur cette voie.

    Merci...

  6. #6
    Membre expert
    Avatar de Sunchaser
    Homme Profil pro
    OPNI (Objet Programmant Non Identifié)
    Inscrit en
    Décembre 2004
    Messages
    2 059
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : OPNI (Objet Programmant Non Identifié)
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Décembre 2004
    Messages : 2 059
    Points : 3 204
    Points
    3 204
    Par défaut
    Citation Envoyé par mnitu Voir le message
    Utilisez Collect mais vous avez quelques problèmes de compréhension des "nested tables" si vous utilisez wm_concat.
    Et oui, il a bien raison le Grand Maître mnitu
    Je devrais donc modifier mon code comme ceci par exemple:
    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
     
    INSERT INTO TST_NESTED
    WITH base_data
            AS (SELECT 1 row_identifier, 'abc' for_collection FROM DUAL
                UNION ALL
                SELECT 1 row_identifier, 'def' for_collection FROM DUAL
                UNION ALL
                SELECT 1 row_identifier, 'ghi' for_collection FROM DUAL
                UNION ALL
                SELECT 1 row_identifier, 'jkl' for_collection FROM DUAL
                UNION ALL
                SELECT 2 row_identifier, 'abc2' for_collection FROM DUAL)
      SELECT a.row_identifier, CAST (COLLECT (a.for_collection) AS tab_tst_nested) for_collection
        FROM base_data a
       WHERE a.row_identifier = 1
    GROUP BY row_identifier;
    Citation Envoyé par jio77 Voir le message
    Très encourageant, je continue sur cette voie.
    Avec le COLLECT donc, c'est mieux.
    Aux persévérants aucune route n'est interdite.
    Celui qui ne sait pas se contenter de peu ne sera jamais content de rien.
    Current Status
    Avec 40% de pollinisateurs invertébrés menacés d'extinction selon les Nations Unies, l'homme risque fort de passer de la monoculture à la mono diète...
    Faîtes quelque chose de bien avec vos petits sous: Enfants du Mekong

  7. #7
    Candidat au Club
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Avril 2017
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Avril 2017
    Messages : 11
    Points : 2
    Points
    2
    Par défaut
    je teste tout ça demain, merci pour vos réponse et je reviens vers vous.
    bonne soirée.

  8. #8
    Candidat au Club
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Avril 2017
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Avril 2017
    Messages : 11
    Points : 2
    Points
    2
    Par défaut
    Merci à tous pour votre aide...
    bonne journée.

  9. #9
    Candidat au Club
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Avril 2017
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Avril 2017
    Messages : 11
    Points : 2
    Points
    2
    Par défaut
    Citation Envoyé par jio77 Voir le message
    Merci à tous pour votre aide...
    bonne journée.
    j'aurai d'autres questions:

    toujours avec le TYPE BANNER_LIST AS TABLE OF NUMBER

    si j'ai ces valeurs:
    ID_MEDIA ID_PRODUCT MONTH_MEDIA_NUM LIST_BANNERS
    10000 629805 201501 BANNER_LIST(34406592, 34567375)
    10000 629805 201501 BANNER_LIST(34406592, 34567375)
    10000 629805 201502 BANNER_LIST(34406592)
    10000 629805 201503 BANNER_LIST(34406592)
    10000 629805 201503 BANNER_LIST(34406592)
    10000 629805 201504 BANNER_LIST(34406592, 34567379)
    10000 629805 201505 BANNER_LIST(34406592, 34567375, 34567379)

    - comment faire en pl/sql pour ne retrouver que les lignes où il n'y a que les valeurs (34406592, 34567379)
    - comment faire un distinct en pl/sql pour éliminer les doublons

    Merci, je débute avec les nested, et votre aide est précieuse.

  10. #10
    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
    Citation Envoyé par jio77 Voir le message
    ...
    - comment faire en pl/sql pour ne retrouver que les lignes où il n'y a que les valeurs (34406592, 34567379)
    - comment faire un distinct en pl/sql pour éliminer les doublons
    On compare une nested table avec une autre
    On utilise l'opérateur SET

Discussions similaires

  1. Insertion croisée dans deux tables mysql
    Par tiger33 dans le forum Requêtes
    Réponses: 6
    Dernier message: 19/09/2006, 08h55
  2. Insertion directe dans une table
    Par zzinfo dans le forum SQL
    Réponses: 2
    Dernier message: 28/02/2006, 15h17
  3. [9i] insertion sequentiel dans une table
    Par djalil dans le forum Oracle
    Réponses: 4
    Dernier message: 17/11/2005, 19h06
  4. [JSP]probleme d'insertion float dans une table
    Par karamazov994 dans le forum Servlets/JSP
    Réponses: 2
    Dernier message: 14/04/2005, 11h49
  5. Insertion valeure dans une table
    Par krfa1 dans le forum Langage SQL
    Réponses: 6
    Dernier message: 29/03/2005, 10h50

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