2016-12-14 3 views
0

Je me demande comment lire les noms de colonne dans Oracle. Ok, je sais qu'il y a une table nommée USER_TAB_COLUMNS qui donne des infos à ce sujet, mais si j'ai une requête imbriquée de niveau 2 ou 3 et que je ne connais pas les noms de colonnes. Ou j'ai juste une requête simple avec une déclaration de jointure et je veux obtenir des noms de colonnes. Comment faire ça? aucune idée?Noms de colonne lus par Oracle à partir de l'instruction select

select * from person a 
join person_details b where a.person_id = b.person_id 

grâce

+1

Puis-je vous demander pourquoi vous ne connaissez pas les noms de colonnes? Sans connaître les détails du schéma, y ​​compris les noms de colonnes, il sera difficile d'écrire des requêtes. –

+0

Je veux écrire une méthode abstraite dans Java qui obtient juste une requête et retourne "assoc map" ou quelque chose comme ça. Donc je ne sais pas quel genre de requête je vais lui passer. Donc, le développeur PL/Sql fait ce travail pour nous lorsque nous lui passons une instruction select. J'ai besoin d'idée comment ça fait ça. – gogagubi

+1

Voir ici: http://stackoverflow.com/questions/8739203/oracle-query-to-fetch-column-names –

Répondre

0

Je pencherais pour:

select 'select ' || LISTAGG(column_name , ',') within group (order by column_id) || ' from T1' 
    from user_tab_columns 
    where table_name = 'T1'; 

pour obtenir une requête de base de données. Pour obtenir des colonnes avec des types de remplir la carte vous pouvez utiliser simplement:

select column_name , data_type 
     from user_tab_columns 
     where table_name = 'T1'; 
0

Je suppose que vous cherchez ceci:

DECLARE 

    sqlStr VARCHAR2(1000); 
    cur INTEGER; 
    columnCount INTEGER; 
    describeColumns DBMS_SQL.DESC_TAB2; 

BEGIN 
    sqlStr := 'SELECT a.*, b.*, SYSDATE as "Customized column name" 
       FROM person a JOIN person_details b 
       WHERE a.person_id = b.person_id'; 

    cur := DBMS_SQL.OPEN_CURSOR; 
    DBMS_SQL.PARSE(cur, sqlStr, DBMS_SQL.NATIVE); 
    DBMS_SQL.DESCRIBE_COLUMNS2(cur, columnCount, describeColumns);  
    FOR i IN 1..columnCount LOOP 
     DBMS_OUTPUT.PUT_LINE (describeColumns(i).COL_NAME); 
    END LOOP; 
    DBMS_SQL.CLOSE_CURSOR(cur); 

END;