7 votes

Renvoyer uniquement les noms de colonnes du ResultSet sans exécuter la requête (Oracle et Java)

Je me demande s'il existe un moyen de renvoyer les noms des colonnes d'un ensemble de résultats (base de données Oracle, en Java) qui seraient générés SI j'exécutais réellement une requête. Par exemple, disons que mon SQL ressemble à quelque chose comme ceci :

select * from <complex table join>;

Existe-t-il un moyen d'envoyer cette requête à oracle et de faire en sorte qu'il me dise quels sont les noms des colonnes du jeu de résultats qu'il retournera SANS exécuter la requête (parce qu'elle est coûteuse) ?

14voto

a_horse_with_no_name Points 100769

Je pense que l'utilisation d'un PreparedStatement pourrait fonctionner :

PreparedStatement stmt = connection.prepareStatement("select ...");
ResultSetMetaData meta = stmt.getMetaData();
for (int col=0; col < meta.getColumnCount(); col++) 
{
   System.out.println("Column: " + meta.getColumnName(col + 1));
}

(Edit) : J'ai essayé cela avec Oracle 11.2 et la version 11.2.0.3 du pilote et cela fonctionne.

Si cela échoue, vous pouvez simplement ajouter un where 1=0 à la requête et l'exécuter ensuite. Au moins, la requête ne renverra pas toutes les lignes (éventuellement en utilisant la fonction Statement.setMaxRows() aussi, juste pour être sûr.

Une dernière option (pourtant assez compliquée) serait d'utiliser dbms_sql pour ouvrir, préparer et décrire la déclaration. Voir le manuel pour plus de détails : http://docs.oracle.com/cd/E11882_01/appdev.112/e25788/d_sql.htm

2voto

Frank Schmitt Points 13554

Vous pouvez essayer d'envelopper la requête dans un select externe et ajouter where 1=0 pour l'empêcher de récupérer des lignes :

  SELECT * from (
    <your query here>
  )
  WHERE 1=0

-1voto

Vikram Points 1363
    SELECT
      COLUMN_NAME
   FROM
      ALL_TAB_COLUMNS
   WHERE
      TABLE_NAME ='tableName';

c'est probablement ce que vous vouliez dire... cependant c'est toujours une requête... juste qu'au lieu d'interroger les tables d'application vous interrogez des tables spéciales

même chose pour les réponses qui demandent des métadonnées

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X