116 votes

Requête Oracle pour récupérer les noms de colonnes

J'ai une requête mySQL pour obtenir des colonnes d'une table comme celle-ci :

String sqlStr="select column_name 
from information_schema.COLUMNS 
where table_name='users' 
and table_schema='"+_db+"' 
and column_name not in ('password','version','id')"

Comment puis-je modifier la requête ci-dessus dans la base de données Oracle 11g ? J'ai besoin d'obtenir les noms des colonnes dans un jeu de résultats pour la table "users" en excluant certaines colonnes et en spécifiant un schéma. Actuellement, toutes les tables se trouvent dans mon nouveau tablespace. Dois-je donc spécifier le nom du tablespace à la place du nom du schéma ?

Existe-t-il également une HQL générique pour cela ? Dans ma nouvelle base de données Oracle (je suis novice en la matière), je n'ai que le nom du tablespace, est-il équivalent au nom du schéma (logiquement ?)?

162voto

Sathya Points 9277

L'équivalent Oracle de information_schema.COLUMNS es USER_TAB_COLS pour les tables appartenant à l'utilisateur actuel, ALL_TAB_COLS o DBA_TAB_COLS pour les tables appartenant à tous les utilisateurs.

Le tablespace n'est pas équivalent à un schéma, et vous n'avez pas non plus à fournir le nom du tablespace.

Fournir le schéma/nom d'utilisateur serait utile si vous voulez faire une requête ALL_TAB_COLS o DBA_TAB_COLS pour les colonnes des tables appartenant à un utilisateur spécifique. dans votre cas, j'imagine que la requête ressemblerait à quelque chose comme :

String sqlStr= "
SELECT column_name
  FROM all_tab_cols
 WHERE table_name = 'USERS'
   AND owner = '" +_db+ "'
   AND column_name NOT IN ( 'PASSWORD', 'VERSION', 'ID' )"

Notez qu'avec cette approche, vous risquez une injection SQL.

EDIT : Mettez en majuscules les noms de tables et de colonnes, car ils sont généralement en majuscules dans Oracle ; ils ne sont en minuscules ou mixtes que s'ils sont créés avec des guillemets.

98voto

Karthik N G Points 214

La requête ci-dessous a fonctionné pour moi dans la base de données Oracle.

select COLUMN_NAME from ALL_TAB_COLUMNS where TABLE_NAME='MyTableName';

39voto

Arsalan Sheikh Points 82

Dans oracle vous pouvez utiliser

desc users

pour afficher toutes les colonnes contenues dans la table des utilisateurs

2voto

yair Points 4298

La requête à utiliser avec Oracle est la suivante :

String sqlStr="select COLUMN_NAME from ALL_TAB_COLUMNS where TABLE_NAME='"+_db+".users' and COLUMN_NAME not in ('password','version','id')"

Je n'ai jamais entendu parler de HQL pour de telles requêtes. Je suppose que cela n'a pas de sens pour les implémentations ORM de s'en occuper. ORM est un Object Relational Mapping, et ce que vous recherchez est un mapping de métadonnées... Vous n'utiliseriez pas HQL, mais plutôt des méthodes API à cette fin, ou du SQL direct. Par exemple, vous pouvez utiliser JDBC DatabaseMetaData .

Je pense que le tablespace n'a rien à voir avec le schéma. Pour l'instant, les tablespaces sont principalement utilisés à des fins techniques logiques internes, ce qui devrait déranger les DBA. Pour plus d'informations sur les tablespaces, voir Document Oracle .

0voto

user3581137 Points 1
String sqlStr= "
SELECT column_name
FROM   all_tab_cols
WHERE  table_name = 'users'
       AND owner = ' || +_db+ || '
       AND column_name NOT IN ( 'password', 'version', 'id' ) 
"

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