[sql] Come posso ottenere i nomi delle colonne da una tabella in Oracle?


Answers

In SQL Server ...

SELECT [name] AS [Column Name]
FROM syscolumns
WHERE id = (SELECT id FROM sysobjects WHERE type = 'V' AND [Name] = 'Your table name')

Type = 'V' per le viste Type = 'U' per le tabelle

Question

Ho bisogno di interrogare il database per ottenere i nomi delle colonne , non per essere confuso con i dati nella tabella. Ad esempio, se ho una tabella denominata EVENT_LOG che contiene eventID , eventType , eventDesc ed eventTime , allora vorrei recuperare i nomi dei campi dalla query e nient'altro.

Ho trovato come farlo in:

Ma ho bisogno di sapere: come può essere fatto in Oracle ?




Per SQL Server:

SELECT [name] AS [Column Name]
FROM syscolumns
WHERE id = object_id('TABLE_NAME')



select column_name,* from information_schema.columns
 where table_name = 'YourTableName'
order by ordinal_position



In Oracle, ci sono due viste che descrivono le colonne:

  • DBA_TAB_COLUMNS descrive le colonne di tutte le tabelle, viste e cluster nel database.

  • USER_TAB_COLUMNS descrive le colonne delle tabelle, delle viste e
    cluster di proprietà dell'utente corrente. Questa vista non mostra il
    Colonna PROPRIETARIO.




describe YOUR_TABLE;

Nel tuo caso :

describe EVENT_LOG;



Query per selezionare i dettagli della colonna in SQL 2008

DECLARE @tableName varchar(20)='item'
SELECT UPPER(COLUMN_NAME)columnname
,DATA_TYPE+(CASE DATA_TYPE WHEN 'numeric' THEN '('+CAST(NUMERIC_PRECISION AS varchar)+','+CAST(NUMERIC_PRECISION_RADIX AS varchar)+')'
                WHEN 'varchar' THEN '('+CAST(CHARACTER_MAXIMUM_LENGTH AS varchar)+')'
                ELSE ''  END)
,'DECLARE @'+COLUMN_NAME+' '+DATA_TYPE+(CASE DATA_TYPE WHEN 'numeric' THEN '('+CAST(NUMERIC_PRECISION AS varchar)+','+CAST(NUMERIC_PRECISION_RADIX AS varchar)+')'
                WHEN 'varchar' THEN '('+CAST(CHARACTER_MAXIMUM_LENGTH AS varchar)+')'
                ELSE ''  END) Declaration
,'@'+ UPPER(COLUMN_NAME)+' '+DATA_TYPE+(CASE DATA_TYPE WHEN 'numeric' THEN '('+CAST(NUMERIC_PRECISION AS varchar)+','+CAST(NUMERIC_PRECISION_RADIX AS varchar)+')'
                WHEN 'varchar' THEN '('+CAST(CHARACTER_MAXIMUM_LENGTH AS varchar)+')'
                ELSE ''  END)+',' XMLDeclare
,'@'+COLUMN_NAME+',' Assign
,COLUMN_NAME,DATA_TYPE,CHARACTER_MAXIMUM_LENGTH,NUMERIC_PRECISION,NUMERIC_PRECISION_RADIX



SELECT COLUMN_NAME 
FROM YourDatabase.INFORMATION_SCHEMA.COLUMNS 
WHERE TABLE_NAME = 'YourTableName'



mysql

SHOW COLUMNS FROM a_table_named_users WHERE Field REGEXP 'user_id|user_name|user_pass'

Ciò restituirà un risultato simile a questo:

Field     |  Type        |   Null   |   Key   |   Default   |   Extra  
user_id      int(8)          NO         PRI       NULL          auto_increment
user_name    varchar(64)     NO         MUL       NULL
user_pass    varchar(64)     NO                   NULL

Quindi per tirare fuori i valori puoi semplicemente

fetch row[0]

Questo è anche ottimo per il passaggio di input in modo dinamico poiché REGEXP richiede il '|' per più ingressi, ma è anche un modo per mantenere separati i dati e facili da memorizzare / passare a classi / funzioni.

Prova a inserire dati fittizi per la sicurezza quando li invii e confronta i dati restituiti quando ricevi errori.




È arrivata questa domanda cercando l'accesso ai nomi delle colonne su Teradata, quindi aggiungerò la risposta per il loro "sapore" di SQL:

SELECT ColumnName
FROM DBC.Columns
WHERE DatabaseName='DBASE_NAME'
AND TableName='TABLE_NAME';

Le informazioni sono memorizzate nel DBB dbase.

Ottenere i tipi di dati è un po 'più complicato : ottieni il tipo di colonna usando le tabelle di sistema teradata




SELECT A.COLUMN_NAME, A.* FROM all_tab_columns a 
WHERE table_name = 'Your Table Name'
AND A.COLUMN_NAME = 'COLUMN NAME' AND a.owner = 'Schema'



Per SQL Server 2008, possiamo utilizzare information_schema.columns per ottenere informazioni sulla colonna

SELECT *
FROM   information_schema.columns
WHERE  table_name = 'Table_Name'
ORDER  BY ordinal_position  



SELECT COLUMN_NAME 'all_columns' 
FROM INFORMATION_SCHEMA.COLUMNS 
WHERE TABLE_NAME='user';



Quella informazione è memorizzata nella tabella di sistema ALL_TAB_COLUMNS :

SQL> select column_name from all_tab_columns where table_name = 'DUAL';

DUMMY

O potresti DESCRIBE la tabella se stai usando SQL * PLUS:

SQL> desc dual
Name                               Null?    Type
----------------------------------------------------- -------- ---------------------- -------------
DUMMY                               VARCHAR2(1)



Related