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

Administration Oracle Discussion :

Lister les colonnes d'une table


Sujet :

Administration Oracle

  1. #1
    Membre du Club
    Femme Profil pro
    Développeur informatique
    Inscrit en
    Août 2005
    Messages
    30
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Août 2005
    Messages : 30
    Points : 40
    Points
    40
    Par défaut Lister les colonnes d'une table
    Bonjour,

    je tente de créer une fonction qui reçoit le nom d'une table et renvoit la liste concaténées des colonnes 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
    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
    45
     
    CREATE OR REPLACE FUNCTION "ORA_MAP"."LISTE_COL_TABLE" (
     PC$TABLE IN VARCHAR2) RETURN VARCHAR2 
    is
     
    CURSOR C_WI IS
      SELECT COLUMN_ID
      FROM
         SYS.USER_TAB_COLUMNS
      WHERE
         TABLE_NAME = PC$TABLE 
      AND
         DATA_TYPE IN ('CHAR','VARCHAR2','NUMBER','DATE')
      ORDER BY COLUMN_ID
      ;
     
    CWI VARCHAR2(30);
    LC$SQLW VARCHAR2(500);
    LN$I INTEGER;
     
    begin
     
       --------------------------------------------------------------------
       -- Récupération de la liste des colonnes de la table sélectionnée --
       --------------------------------------------------------------------
     
       LN$I := 1 ;
       LC$SQLW := '';
     
    	 OPEN C_WI;
    	 LOOP
    		 FETCH C_WI INTO CWI;
                                   IF LN$I > 1 THEN
                                        LC$SQLW := LC$SQLW || ', ' ;
                                   END IF ;
     
                                  LC$SQLW := LC$SQLW || ''''|| CWI || ''''  ;
                                  LN$I := LN$I + 1 ;
    		 EXIT WHEN C_WI%NOTFOUND;
    	 END LOOP;
    	 CLOSE C_WI;
     
    	 RETURN LC$SQLW;
     
    end;
    Cependant le curseur ne semble pas fonctionner. Il me renvoit une liste vide.

    Si quelqu'un a une idée.

    J'ai 2 serveurs Oracle : 1 de test et 1 de prod (distant). Le but est de faire une procédure qui mette à jour les données de la table Oracle distante avec les données de la table passée en paramètre pour les lignes sélectionnées : une sorte d'Update générique.

    Par exemple, un appel du type :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    execute ora_map.transfert_table('table1','where entityid in (1,2,3)');
    1 . on récupère le nom des colonnes de table 'table1'
    2 . on récupère les données de table1 qui vérifient la condition (sur le serveur local)
    3 . on fait la MAJ des données de table1 sur le serveur distant. Si les enregistrements n'existent pas, il faut les créer.

    Si quelqu'un a déjà fait ce type de chose.

    Je penses que si j'arrive à faire fonctionner le premier point, je pourrai faire la suite.

    D'avance merci pour vos réponses.

    SPG40.

  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 fetches du number dans du varchar2.
    Utilises plutôt le
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    FOR rwi in C_WI
    LOOP 
     LC$SQLW := rwi.column_id || .....;
    END LOOP;
    pas besoin de close, de %NOTFOUND, etc...

    Ensuite c'est du débogage, mets des DBMS_OUTPUT et lance ta procédure, tu verras où ça passe et où ça passe pas.

  3. #3
    Membre du Club
    Femme Profil pro
    Développeur informatique
    Inscrit en
    Août 2005
    Messages
    30
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Août 2005
    Messages : 30
    Points : 40
    Points
    40
    Par défaut
    Citation Envoyé par McM
    Tu fetches du number dans du varchar2.
    Utilises plutôt le
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    FOR rwi in C_WI
    LOOP 
     LC$SQLW := rwi.column_id || .....;
    END LOOP;
    pas besoin de close, de %NOTFOUND, etc...

    Ensuite c'est du débogage, mets des DBMS_OUTPUT et lance ta procédure, tu verras où ça passe et où ça passe pas.
    OK.

    C'est ce que j'ai fait, mais en fait il ne rentre pas dans ma boucle FOR.
    Par contre, avec OPEN...FETCH...CLOSE, il rentre bien dans le FETCH. Une idée?

    J'utilise du VARCHAR2 car je veux avoir les COLUMN_NAME à la fin (les COLUMN_ID, c'est pour tester).

    SPG40.

  4. #4
    Membre expert

    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Janvier 2004
    Messages
    2 862
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 862
    Points : 3 609
    Points
    3 609
    Par défaut
    Dans la base le nom des tables est en majuscules

  5. #5
    Membre du Club
    Femme Profil pro
    Développeur informatique
    Inscrit en
    Août 2005
    Messages
    30
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Août 2005
    Messages : 30
    Points : 40
    Points
    40
    Par défaut
    C'est ce que je lui passe comme paramètre. La requête de SELECT s'exécute correctement dans SQL*Plus Worksheet et j'ai bien mes noms de colonnes.

    SPG40

  6. #6
    Membre expert

    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Janvier 2004
    Messages
    2 862
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 862
    Points : 3 609
    Points
    3 609
    Par défaut
    Il n'y a aucune raison que la requête marche sous SQL*Plus et pas en PL/SQL (hormis un éventuel problème de droits sur user_tables, mais tu aurais un message d'erreur). S'il ne rentre pas dans le for c'est que ta requête ne ramène aucune ligne.

    Comme te l'as dit McM, c'est du debuggage mets des dbms_output pour voir ce qui ce passe.

  7. #7
    Rédacteur

    Homme Profil pro
    Développeur et DBA Oracle
    Inscrit en
    Octobre 2006
    Messages
    878
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur et DBA Oracle

    Informations forums :
    Inscription : Octobre 2006
    Messages : 878
    Points : 1 197
    Points
    1 197
    Par défaut
    salut,

    Je l'ai executé et ca marche bien .

    Est ce que ta fonction est déclarée public?

    Peut etre tu l'executes dans un autre user qui contient pas ta table ?

  8. #8
    Membre du Club
    Femme Profil pro
    Développeur informatique
    Inscrit en
    Août 2005
    Messages
    30
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Août 2005
    Messages : 30
    Points : 40
    Points
    40
    Par défaut
    OK.

    J'ai compris. J'ai ma fonction dans un User générique (ORA_MAP) qui contient uniquement les fonctions et procédures communes à tous mes autres users. Je me loggais en tant que ORA_USER1 et j'appelais ma fonction (ORA_USER1 avait les droits EXECUTE sur ma fonction dans ORA_MAP), mais le pb c'est que le curseur cherchait dans la vue SYS.USER_TAB_COLUMNS de ORA_MAP et pas de ORA_USER1. Je fait donc ma recherche dans SYS.DBA_TAB_COLUMNS et là au miracle ça marche...

    Merci pour vos réponses, elles m'ont bien aidé.

    A+.

    SPG40.

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

Discussions similaires

  1. [SQL-Server] Lister les colonnes d'une table
    Par tintin31000 dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 15/10/2008, 11h33
  2. [ADO] Lister les colonnes d'une table DBF
    Par drouault dans le forum VB 6 et antérieur
    Réponses: 3
    Dernier message: 07/09/2006, 17h21
  3. [VB6/ACCESS] Lister les champs d'une table
    Par Sytchev3 dans le forum VB 6 et antérieur
    Réponses: 8
    Dernier message: 07/06/2006, 19h01
  4. paramètrer les colonnes d'une table en VBA
    Par papilou86 dans le forum VBA Access
    Réponses: 2
    Dernier message: 27/05/2006, 16h47
  5. [MySQL] lister les occurrences d'une table
    Par youyoule dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 07/09/2005, 20h37

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