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 :

[11g] Insertion dynamique selon nombre de colonnes


Sujet :

SQL Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre Expert
    Avatar de Julien59
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    1 142
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Mars 2008
    Messages : 1 142
    Par défaut [11g] Insertion dynamique selon nombre de colonnes
    Bonjour à tous,

    Dur de résumer mon problème dans un titre en quelques mots
    Je m'explique :
    J'ai une base de prod et une base de recette. La base de recette est en fait un échantillon de la prod.
    Mon but : créer un script pour que l’alimentation se fasse automatiquement. Le problème, c’est que la structure des tables change et des colonnes peuvent être ajoutées. Or, le script ne doit pas bouger. Les tables sont par contre définies et le nombre ne bougera plus.
    Ma question est donc la suivante :
    Comment faire pour appeler toutes les colonnes (sans passer par * pour éviter les problème de structure différente) de façon dynamique ?
    J’ai essayé de passer par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     Select  
    (select distinct column_name from all_tab_cols where table_name = ’MATABLE’ and column_name = ‘COLONNE’) 
    from 
    ‘MATABLE’
    Malheureusement, il me renvoie ‘COLONNE’ et non pas le contenu de la colonne. Logique, puisque c’est un champ alphanumérique.

    Merci de votre aide

  2. #2
    Membre chevronné
    Profil pro
    Inscrit en
    Février 2010
    Messages
    412
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 412
    Par défaut

    Si les structures changent, vous devez aussi modifier les tables sur la base "cible" non? Comment vous y prenez-vous?

    Parce que sinon, drop schema, un expdp/impdp et ca roule.

    Ou si vous avez un autre exemple (le plus simple possible), la je comprends pas tres bien.

  3. #3
    Membre Expert
    Avatar de Julien59
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    1 142
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Mars 2008
    Messages : 1 142
    Par défaut
    Les structures évoluent des 2 côtés en même temps en effet, mais l'alimentation est faite uniquement en prod.

    L'idée, c'est : j'ajoute une colonne en prod + recette, j'alimente en prod, et je veux récupérer ce qu'il y'a en prod en recette sans toucher à mon script de départ.

    J'ai une table1, j'ai fait un script qui récupère les données de la prod vers la recette.
    J'ajoute une colonne à ma table1 en prod et en recette. Je lance l'alim en prod, je veux lancer le même script que précédemment pour alimenter la recette, mais qu'il prenne en compte la nouvelle colonne.

    J'espère que c'est assez clair.

  4. #4
    Membre éprouvé
    Inscrit en
    Septembre 2008
    Messages
    101
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 101
    Par défaut
    Si vous utilisez Oracle11 et que vous pouvez utiliser pl/SQL, voilà peut-être une solution qui utilise un databaselink :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    declare 
      MaRequete varchar2(32000);
    begin
       select 'insert into ' || tt.owner || '.' || tt.table_name || ' (' || tt.colonnes || ') (Select ' || tt.Colonnes || ' From ' 
            || tt.owner || '.' || tt.table_name || '@DataLink)' into MaRequete
         from (Select t.owner, t.table_name, listagg (t.column_name, ',') WITHIN GROUP (ORDER BY t.column_name) colonnes 
                 From ALL_TAB_COLS T
                Where T.TABLE_NAME = UPPER('MaTable')
        group by t.owner, t.table_name) tt;
     
       execute immediate MaRequete;
    end;

  5. #5
    Membre Expert
    Avatar de Julien59
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    1 142
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Mars 2008
    Messages : 1 142
    Par défaut
    Super, c'est ce qu'il me faut ! Y'a plus qu'à réadapter

    Pour le moment il me met une erreur, mais je devrais m'en sortir maintenant.

    Un grand merci !

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

Discussions similaires

  1. BULK INSERT et nombre de colonnes variable
    Par hannii dans le forum MS SQL Server
    Réponses: 6
    Dernier message: 20/07/2009, 20h02
  2. Réponses: 2
    Dernier message: 13/05/2009, 14h47
  3. Réponses: 3
    Dernier message: 14/05/2007, 11h00
  4. Insertion dynamique de lignes en colonne dans un tableau
    Par lodan dans le forum Général JavaScript
    Réponses: 7
    Dernier message: 23/03/2007, 07h18
  5. [JTextArea]changer dynamiquement le nombre de colonnes
    Par MrDuChnok dans le forum Composants
    Réponses: 9
    Dernier message: 27/04/2004, 13h31

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