web-dev-qa-db-fra.com

Requête Oracle pour extraire les noms de colonnes

J'ai une requête mySQL pour obtenir les 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 modifier la requête ci-dessus dans la base de données Oracle 11g? Je dois obtenir les noms de colonnes sous forme de jeu de résultats pour la table 'utilisateurs', à l'exception de certaines colonnes spécifiant un schéma. À l’heure actuelle, j’ai toutes les tables dans mon nouvel espace de table. Par conséquent, dois-je spécifier le nom de l’espace de table au lieu du nom de schéma?

De plus, existe-t-il un HQL générique pour cela? Dans ma nouvelle base de données Oracle (je ne connais pas encore Oracle), je n’ai que le nom de l’espace table, c’est donc équivalent au nom du schéma (logique?)

98
pri_dev

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

L'espace de table n'est pas équivalent à un schéma, vous n'avez pas non plus à fournir le nom de l'espace de table.

Fournir le schéma/nom d'utilisateur serait utile si vous souhaitez interroger ALL_TAB_COLS ou DBA_TAB_COLS pour les colonnes de tables OF 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: Les noms de table et de colonne ont été mis en majuscule car ils sont généralement en majuscule dans Oracle; ils ne sont que des majuscules ou des minuscules s'ils sont créés avec des guillemets doubles.

142
Sathyajith Bhat

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';
85
Karthik N G

dans Oracle, vous pouvez utiliser 

desc users

pour afficher toutes les colonnes contenant dans la table des utilisateurs

34
Arsalan Sheikh

La seule façon dont j'ai pu obtenir les noms de colonne a été d'utiliser la requête suivante:

select COLUMN_NAME
FROM all_tab_columns atc
WHERE table_name like 'USERS'
2
MrElbow

La requête à utiliser avec Oracle est:

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

Jamais entendu parler de HQL pour de telles requêtes. Je suppose que cela n’a aucun sens pour les implémentations ORM de s’y attaquer. ORM est un mappage relationnel objet et vous recherchez un mappage de métadonnées ... Vous ne voudriez pas utiliser HQL, mais plutôt utiliser des méthodes API à cet effet, ou utiliser du SQL direct. Par exemple, vous pouvez utiliser JDBC DatabaseMetaData .

Je pense que le tablespace n'a rien à voir avec le schéma. Les espaces de table AFAIK sont principalement utilisés à des fins techniques internes logiques, ce qui devrait déranger les administrateurs de base de données. Pour plus d'informations sur les espaces de table, voir doc Oracle .

2
yair

À plusieurs reprises, nous aurions besoin d’une liste de toutes les colonnes d’une table séparée par des virgules dans un schéma. Dans de tels cas, nous pouvons utiliser cette fonction générique qui récupère la liste séparée par des virgules sous forme de chaîne. 

CREATE OR REPLACE FUNCTION cols(
    p_schema_name IN VARCHAR2,
    p_table_name  IN VARCHAR2)
  RETURN VARCHAR2
IS
  v_string VARCHAR2(4000);
BEGIN
  SELECT LISTAGG(COLUMN_NAME , ',' ) WITHIN GROUP (
  ORDER BY ROWNUM )
  INTO v_string
  FROM ALL_TAB_COLUMNS
  WHERE OWNER    = p_schema_name
  AND table_name = p_table_name;
  RETURN v_string;
END;
/

Ainsi, le simple fait d'appeler la fonction à partir de la requête génère une ligne avec toutes les colonnes.

select cols('HR','EMPLOYEES') FROM DUAL;

EMPLOYEE_ID,FIRST_NAME,LAST_NAME,EMAIL,PHONE_NUMBER,HIRE_DATE,JOB_ID,SALARY,COMMISSION_PCT,MANAGER_ID,DEPARTMENT_ID

Remarque: LISTAGG échouera si la longueur totale de toutes les colonnes dépasse 4000 caractères, ce qui est rare. Dans la plupart des cas, cela fonctionnera.

0
Kaushik Nayak

Vous pouvez essayer ceci:

décrire 'Nom de la table'

Il renverra tous les noms de colonne et types de données

0
Reza Rahimi

le fait est que crapaud vous devez écrire majuscule nom de la table, comme ceci:

select *
FROM all_tab_columns
where table_name like 'IDECLARATION';
0
Ghadir Farzaneh

Je trouve celui-ci utile dans Oracle:

SELECT 
    obj.object_name, 
    atc.column_name, 
    atc.data_type, 
    atc.data_length 
FROM 
    all_tab_columns atc,
    (SELECT 
        * 
     FROM 
         all_objects
     WHERE 
        object_name like 'GL_JE%'
        AND owner = 'GL'
        AND object_type in ('TABLE','VIEW')   
    ) obj
WHERE 
    atc.table_name = obj.object_name
ORDER BY 
    obj.object_name, 
    atc.column_name;
0
Dave C.
  1. SELECT * FROM <SCHEMA_NAME.TABLE_NAME> WHERE ROWNUM = 0; -> Notez que ceci est un résultat de requête, un ResultSet. Ceci est exportable dans d'autres formats ..__ Et vous pouvez aussi exporter le format Résultat de la requête au Text. L'exportation ressemble à celle ci-dessous quand j'ai fait SELECT * FROM SATURN.SPRIDEN WHERE ROWNUM = 0;

    "SPRTELE_PIDM" "SPRTELE_SEQNO" "SPRTELE_TELE_CODE" "SPRTELE_ACTIVITY_DATE" "SPRTELE_PHONE_AREA" "SPRTELE_PHONE_NUMBER" "SPRTELE_PHONE_EXT" "SPRTELE_STATUS_IND" "SPRTELE_ATYP_CODE" "SPRTELE_ADDR_SEQNO" "SPRTELE_PRIMARY_IND" "SPRTELE_UNLIST_IND" "SPRTELE_COMMENT" "SPRTELE_INTL_ACCESS" "SPRTELE_DATA_Origin" "SPRTELE_USER_ID" « SPRTELE_CTRY_CODE_PHONE "" SPRTELE_SURROGATE_ID "" SPRTELE_VERSION "" SPRTELE_VPDI_CODE "

  2. DESCRIBE <TABLE_NAME> -> Remarque: il s'agit d'une sortie de script.

0
Uddhav Gautam