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 :

Retourner le type des colonnes d'une requête donnée


Sujet :

Oracle

  1. #1
    Candidat au Club
    Homme Profil pro
    Inscrit en
    Mars 2012
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations forums :
    Inscription : Mars 2012
    Messages : 4
    Points : 4
    Points
    4
    Par défaut Retourner le type des colonnes d'une requête donnée
    Bonjour,

    Je suis actuellement en train d'écrire une procédure PL/SQL qui reçoit en paramètre un VARCHAR2 contenant une requête SQL
    Tel que :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT col1,col2,col3 FROM maTable;
    ou
    SELECT * FROM maTable;
    etc.

    J'étais parti sur une solution avec "DBMS_SQL" et son "DESCRIB_COLUMNS" ce qui me retournait au lieu du nom du type (varchar, number, etc) une valeur numérique lui correspondant.
    Malheureusement, je n'ai pas trouvé dans le dictionnaire la table faisant la lisaison entre ces chiffres et les noms des types.

    J'allais donc incorporé un "DECODE" ou des test "IF / ELSE IF" (comme on me l'a conseillé sur ce forum).
    Pour cela il me fallait savoir quel chiffre correspondait à quel type, j'ai donc lancer un test et là horreur...

    ---------------------------------------------------
    col_type = 2
    col_name = NUMERO
    ---------------------------------------------------
    col_type = 1
    col_name = P_VARCHAR2
    ---------------------------------------------------
    col_type = 96
    col_name = P_CHAR
    ---------------------------------------------------
    col_type = 96
    col_name = P_NCHAR
    ---------------------------------------------------
    col_type = 2
    col_name = P_INTEGER
    ---------------------------------------------------
    col_type = 2
    col_name = P_FLOAT
    ---------------------------------------------------
    col_type = 2
    col_name = P_REAL
    ---------------------------------------------------
    col_type = 2
    col_name = P_DEC
    ---------------------------------------------------
    col_type = 2
    col_name = P_DECIMAL
    ---------------------------------------------------
    col_type = 12
    col_name = P_DATE
    ---------------------------------------------------
    col_type = 180
    col_name = P_TIMESTAMP
    Tout les types numériques sont associé au même "numéro de type"...


    Me voilà donc repasser à la case départ..
    Comment réussir à récupérer le nom des colonnes et leurs type dans une requête SQL qui est sous forme d'une variable VARCHAR2. Tout ça étant dans la procédure d'un package.

    Merci d'avance !

  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
    Je ne sais pas si c'est possible.

    Une possibilité pas top mais qui marchera : Créer dynamiquement une vue ou une table temporaire avec le select et un where 1=0, lire les types avec un desc (user_tab_columns), puis dropper la vue

    Attention aux objets NULL (genre un select null from dual) qui plantera

  3. #3
    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
    voici un exemple à peaufiner sur le types

    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
    DECLARE
     v_chaine VARCHAR2(200) := 'select 1 as num, sysdate as ladate, v.* from all_views v';
    BEGIN
    	execute immediate 'create view V_TEMP as '|| v_chaine;
     FOR r IN (SELECT column_name, data_type, data_length, data_precision, data_scale FROM all_tab_columns 
     				WHERE owner = USER AND table_name = 'V_TEMP' ORDER BY column_id)
    	LOOP
    		DBMS_OUTPUT.put_line(r.column_name ||' '|| r.data_type ||' ('|| r.data_length ||'.'|| r.data_precision ||'.'|| r.data_scale ||')');
      END LOOP;
      execute immediate 'drop view V_TEMP';
    END;
     
    NUM NUMBER (22..)
    LADATE DATE (8..)
    OWNER VARCHAR2 (30..)
    VIEW_NAME VARCHAR2 (30..)
    TEXT_LENGTH NUMBER (22..)
    TEXT LONG (0..)
    TYPE_TEXT_LENGTH NUMBER (22..)
    TYPE_TEXT VARCHAR2 (4000..)
    OID_TEXT_LENGTH NUMBER (22..)
    OID_TEXT VARCHAR2 (4000..)
    VIEW_TYPE_OWNER VARCHAR2 (30..)
    VIEW_TYPE VARCHAR2 (30..)
    SUPERVIEW_NAME VARCHAR2 (30..)

  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
    La doc Oracle du package DBMS_SQL contient l'exemple qu'il vous faut.
    La correspondence des types se trouve dans la doc aussi: Oracle Built-in Datatypes

  5. #5
    Candidat au Club
    Homme Profil pro
    Inscrit en
    Mars 2012
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations forums :
    Inscription : Mars 2012
    Messages : 4
    Points : 4
    Points
    4
    Par défaut
    Rebonjour !
    Désolé de mon temps de réponse, j'étais en déplacement.

    Merci beaucoup pour vos réponses !
    J'ai pu en utilisant les liens de la docs trouver et mettre en place exactement se que je cherchais !

    Encore merci et bonne journée !

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

Discussions similaires

  1. Réponses: 9
    Dernier message: 27/04/2012, 15h44
  2. Renommer des colonnes dans une requête SQL en utilisant bcp
    Par Polochon_77 dans le forum Développement
    Réponses: 2
    Dernier message: 14/01/2012, 19h50
  3. Réponses: 9
    Dernier message: 10/10/2008, 17h39
  4. Liste des colonnes d'une requête
    Par romuald07 dans le forum PL/SQL
    Réponses: 5
    Dernier message: 05/08/2008, 18h24
  5. Ordre des Colonnes d'une requête
    Par dlh1222 dans le forum Access
    Réponses: 4
    Dernier message: 15/09/2005, 00h43

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