2012-01-05 22 views
78

ho una query MySQL per ottenere colonne da una tabella come questa:query di Oracle per andare a prendere i nomi di colonna

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 faccio a cambiare la query di cui sopra nel database Oracle 11g? Ho bisogno di ottenere i nomi delle colonne come set di risultati per gli 'utenti' della tabella 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?

C'è anche un HQL generico per questo? Nel mio nuovo database Oracle (io sono nuovo di Oracle), ho solo nome dello spazio tabella, in modo da è che equivale a nome dello schema (logicamente?)

risposta

121

L'equivalente Oracle per information_schema.COLUMNS è USER_TAB_COLS per le tabelle di proprietà dell'utente corrente, ALL_TAB_COLS oppure DBA_TAB_COLS per le tabelle di proprietà di tutti gli utenti.

Tablespace non è equivalente a uno schema, né devi fornire il nome del tablespace.

Fornire lo schema/nome utente sarebbe utile se si desidera eseguire una query su ALL_TAB_COLS o DBA_TAB_COLS per le colonne di tabelle di proprietà di un utente specifico. nel tuo caso, immagino che la query assomiglierà a qualcosa:

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

Si noti che con questo approccio si rischia l'iniezione SQL.

+2

dal modo in cui ho trovato un modo generico di fare questo a prescindere dalla databbase attraverso jdbc .. con il link qui: http://www.kodejava.org/examples/163.html –

+0

Ho anche dovuto aggiungere 'e virtual_column = 'NO'' alla mia richiesta. – musicin3d

2

la query per 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 domande. Suppongo che non abbia senso implementare ORM per affrontarlo. ORM è una mappatura relazionale degli oggetti, e quello che stai cercando è la mappatura dei metadati ... Non useresti HQL, piuttosto usi i metodi API per questo scopo, o l'SQL diretto. Ad esempio, è possibile utilizzare JDBC DatabaseMetaData.

Penso che tablespace non abbia nulla a che fare con lo schema. I tablespace AFAIK sono principalmente utilizzati per scopi logici interni tecnici che dovrebbero preoccupare i DBA. Per ulteriori informazioni sui tablespace, vedere Oracle doc.

-1

È possibile utilizzare la query di seguito 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 sostituire il COLUMN_NAME con il nome della colonna che si sta cercando.

+0

Forse dovresti cercare domande DB2 per rispondere? Dubito che qualcuno alla ricerca di Oracle abbia 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. –

70

La query seguente ha funzionato per me nel database Oracle.

select COLUMN_NAME from ALL_TAB_COLUMNS where TABLE_NAME='MyTableName'; 
+21

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

+1

@ user565869 Vorrei usare 'where lower (TABLE_NAME) = lower ('WHATEVER')', altrimenti quando il nome della tabella ha caratteri maiuscoli non troverà la tabella –

+0

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

29

in Oracle è possibile utilizzare

desc users 

per visualizzare tutte le colonne contenenti nella tabella utenti

+2

Perché questo non ha più upvotes? –

+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

+4

La mancanza di upvotes non fa di 'desc users 'una brutta risposta ad alcune domande, ma non è una buona risposta a questo. – Ehryk

0

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

Questa risposta è molto difficile da leggere. Si prega di prendere in considerazione la riformattazione. – chharvey

4

Si può provare questo : (Funziona su 11g e restituisce tutto il nome della colonna da una tabella, qui test_tbl è il nome della tabella e user_tab_columns sono colonne utente autorizzato della tabella)

select COLUMN_NAME from user_tab_columns 
where table_name='test_tbl'; 

2

L'unico modo che io ero in grado di ottenere i nomi di colonna stava usando la seguente query:

select COLUMN_NAME 
FROM all_tab_columns atc 
WHERE table_name like 'USERS' 
0

in diverse occasioni , avremmo bisogno di un elenco separato da virgole di tutte le colonne da 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, richiamare semplicemente la funzione dalla query produce 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 avrà esito negativo se la lunghezza complessiva di tutte le colonne supera 4000 caratteri che è raro. Per la maggior parte dei casi, funzionerà.

0

Si può provare questo:

descrivono 'Table Name'

Si restituirà tutti i nomi delle colonne ei tipi di dati

Problemi correlati