Query Oracle per recuperare i nomi delle colonne


123

Ho una query mySQL per ottenere colonne da una tabella come questa:

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')"

Come si modifica la query precedente nel database Oracle 11g? Ho bisogno di ottenere i nomi delle colonne come un set di risultati per la tabella "utenti" escludendo determinate colonne, specificando uno schema. In questo momento ho tutte le tabelle nel mio nuovo tablespace, quindi devo specificare il nome del tablespace al posto del nome dello schema?

Inoltre esiste un HQL generico per questo? Nel mio nuovo database Oracle (sono nuovo in Oracle), ho solo il nome del tablespace, quindi è equivalente al nome dello schema (logicamente?)

Risposte:


176

L'equivalente Oracle per information_schema.COLUMNSè USER_TAB_COLSper le tabelle di proprietà dell'utente corrente ALL_TAB_COLSo DBA_TAB_COLSper le tabelle di proprietà di tutti gli utenti.

Il tablespace non è equivalente a uno schema, né è necessario fornire il nome del tablespace.

Fornire lo schema / nome utente sarebbe utile se si desidera eseguire una query ALL_TAB_COLSo DBA_TAB_COLSper le colonne di tabelle di proprietà di un utente specifico. nel tuo caso, immagino che la query sarebbe simile a:

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

Nota che con questo approccio rischi di SQL injection.

EDIT: maiuscolo i nomi di tabella e colonna in quanto questi sono tipicamente maiuscoli in Oracle; sono solo minuscole o miste se create racchiuse tra virgolette doppie.


2
a proposito, ho trovato un modo generico per farlo indipendentemente dal database tramite jdbc .. con il link qui: kodejava.org/examples/163.html
pri_dev

Ho anche dovuto aggiungere and virtual_column = 'NO'alla mia query.
musicin3d

101

La query seguente ha funzionato per me nel database Oracle.

select COLUMN_NAME from ALL_TAB_COLUMNS where TABLE_NAME='MyTableName';

26
Tieni presente che Oracle fa distinzione tra maiuscole e minuscole. Di solito uso ...WHERE LOWER(Table_Name) = 'mytablename';.

2
@ user565869 lo userei where lower(TABLE_NAME) = lower('WHATEVER'), altrimenti quando il nome della tabella ha un carattere maiuscolo non troverà nemmeno la tabella
AlexanderD

SELECT column_name FROM all_tab_cols WHERE UPPER(Table_Name) = UPPER('tablename');funziona altrettanto bene.
user3553260

L'utilizzo di lower(TABLE_NAME)o upper(TABLE_NAME)richiede che Oracle esegua una scansione della ALL_TAB_COLUMNStabella per ottenere tutti i valori TABLE_NAMEprima di poterlo confrontare con quello fornito UPPER('MyTableName'). Nei test rapidi questo ha reso le prestazioni inutilizzabili per il mio scopo, quindi mi atterrò a confronti con distinzione tra maiuscole e minuscole.
Chris Magnuson

40

in Oracle puoi usare

desc users

per visualizzare tutte le colonne che contengono nella tabella utenti


6
... perché sebbene rappresenti una risposta a 'come ottenere un elenco di tutte le colonne di una tabella', non risponde alla domanda che è stata posta: 1) non è una query, 2) non limita / filtra le colonne restituite, 3) restituisce un set di risultati?
Ehryk

6
La mancanza di voti positivi non è desc usersuna cattiva risposta ad alcune domande, ma non è una buona risposta a questa .
Ehryk

e poiché non è una query sql, è piuttosto un comando sql * plus. checkout questo per ulteriori informazioni: stackoverflow.com/questions/37133666/...
01000001

7

Puoi provare questo: (Funziona su 11g e restituisce il nome di tutte le colonne da una tabella, qui test_tbl è il nome della tabella e user_tab_columns sono le colonne della tabella consentite dall'utente)

select  COLUMN_NAME  from user_tab_columns
where table_name='test_tbl'; 


1
USER_TAB_COLUMNSsono in realtà le colonne delle tabelle di proprietà dell'utente, non quelle delle tabelle consentite all'utente.
David Faber

2

La query da utilizzare con Oracle è:

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

Mai sentito parlare di HQL per tali query. Presumo che non abbia senso per le implementazioni ORM affrontarlo. ORM è una mappatura relazionale di oggetti e quello che stai cercando è la mappatura dei metadati ... Non useresti HQL, piuttosto usi metodi API per questo scopo o SQL diretto. Ad esempio, puoi utilizzare JDBC DatabaseMetaData .

Penso che il tablespace non abbia nulla a che fare con lo schema. AFAIK gli spazi tabelle vengono utilizzati principalmente per scopi tecnici interni logici che dovrebbero disturbare gli amministratori di database. Per ulteriori informazioni sugli spazi tabella, vedere il documento Oracle .


TABLE_NAME='"+_db+".users'avrà esito negativo; è necessario separare proprietario / schema e nome della tabella inALL_TAB_COLUMNS
David Faber

2

L'unico modo in cui sono stato in grado di ottenere i nomi delle colonne è stato utilizzare la seguente query:

select COLUMN_NAME
FROM all_tab_columns atc
WHERE table_name like 'USERS'

2

il punto è che in toad devi scrivere il nome della tabella maiuscolo, in questo modo:

select *
FROM all_tab_columns
where table_name like 'IDECLARATION';

1

Trovo utile questo in 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;

Questa risposta è molto difficile da leggere. Si prega di considerare la riformattazione.
chharvey

E se ci sono più tabelle con lo stesso nome, ma proprietari diversi?
David Faber

1

In diverse occasioni, avremmo bisogno di un elenco separato da virgole di tutte le colonne di una tabella in uno schema. In questi casi possiamo usare questa funzione generica che recupera l'elenco separato da virgole come una stringa.

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;
/

Quindi, semplicemente chiamando la funzione dalla query si ottiene una riga con tutte le colonne.

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

Nota: LISTAGG fallirà se la lunghezza combinata di tutte le colonne supera i 4000caratteri, il che è raro. Nella maggior parte dei casi, funzionerà.


0
  1. SELECT * FROM <SCHEMA_NAME.TABLE_NAME> WHERE ROWNUM = 0;-> Nota che questo è il risultato della query, un ResultSet. Questo è esportabile in altri formati. Inoltre, puoi esportare il risultato della query in Textformato. L'esportazione appare come di seguito quando l'ho fatto 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> -> Nota: questo è l'output dello script.


-1

È possibile utilizzare la query seguente per ottenere un elenco di nomi di tabella che utilizza la colonna specifica in DB2:

SELECT TBNAME                
FROM SYSIBM.SYSCOLUMNS       
WHERE NAME LIKE '%COLUMN_NAME'; 

Nota: qui sostituisci il COLUMN_NAMEcon il nome della colonna che stai cercando.


Forse dovresti cercare le domande DB2 a cui rispondere? Dubito che qualcuno alla ricerca di Oracle avrebbe bisogno di una risposta DB2.
RichardTheKiwi

1
Questa risposta in realtà mi ha aiutato. Sto usando DB2 in modalità Oracle e non supporta all_tab_cols.
wm_eddie

-1

Puoi provare questo:

descrivere "Nome tabella"

Restituirà tutti i nomi di colonna e i tipi di dati

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.