Est-il possible d'obtenir les types / noms d'une requête de base de données inconnue sans l'exécuter?

StackOverflow https://stackoverflow.com/questions/163389

  •  03-07-2019
  •  | 
  •  

Question

J'ai une application Web dans laquelle les utilisateurs entrent des requêtes SQL arbitraires pour un traitement ultérieur par lots. Nous voulons valider la syntaxe de la requête sans l'exécuter réellement. Certaines requêtes prendront beaucoup de temps, c'est pourquoi nous ne voulons pas les exécuter. J'utilise dbms_sql.parse d'Oracle pour le faire.

Toutefois, je dois maintenant connaître le nombre et le type des colonnes du jeu de résultats. Y a-t-il un moyen de faire cela sans exécuter la requête? Autrement dit, Oracle doit analyser la requête et me dire quels types de données / noms de résultats seront renvoyés lorsque la requête sera réellement exécutée? J'utilise Oracle 10g et c'est une application Java 1.5 / Servlet 2.4.

Modifier: les utilisateurs qui entrent dans les requêtes sont déjà des utilisateurs de la base de données. Ils s'authentifient auprès de mon application avec leurs informations d'identification de base de données et les requêtes sont exécutées à l'aide de ces informations d'identification. Par conséquent, ils ne peuvent lancer aucune requête qu’ils ne pourraient pas exécuter en se connectant simplement avec sqlplus.

Était-ce utile?

La solution

Vous devriez pouvoir préparer une requête SQL pour valider la syntaxe et obtenir les métadonnées de l'ensemble de résultats. La préparation d'une requête ne doit pas l'exécuter.

import java.sql.*;
. . .
Connection conn;
. . .
PreparedStatement ps = conn.prepareStatement("SELECT * FROM foo");
ResultSetMetadata rsmd = ps.getMetaData();
int numberOfColumns = rsmd.getColumnCount();

Vous pouvez ensuite obtenir des métadonnées sur chaque colonne du jeu de résultats.

Autres conseils

Si vous voulez le faire strictement par le biais de pl / sql, procédez comme suit:

DECLARE 
  lv_stat varchar2(100) := 'select blah blah blah';
  lv_cur INTEGER;
  lv_col_cnt INTEGER;
  lv_desc DBMS_SQL.desc_tab;
BEGIN
  DBMS_SQL.parse(lv_cur,lv_stat,DBMS_SQL.NATIVE);
  DBMS_SQL.describe_columns(lv_cur,lv_col_cnt,lv_desc);
  FOR ndx in lv_desc.FIRST .. lv_desc.LAST LOOP
    DBMS_OUTPUT.PUT_LINE(lv_desc(ndx).col_name ||' '||lv_desc(ndx).col_type);
  END LOOP;
END;

DBMS_SQL.desc_tab contient à peu près tout ce que vous devez savoir sur les colonnes.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top