Wie kann ich Spaltennamen aus einer Tabelle in Oracle abrufen?


184

Ich muss die Datenbank abfragen, um die Spaltennamen zu erhalten , und darf nicht mit den Daten in der Tabelle verwechselt werden. Zum Beispiel, wenn ich eine Tabelle mit dem Namen habe , EVENT_LOGdas enthält eventID, eventType, eventDesc, und eventTime, dann würde ich mag sonst diese Feldnamen aus der Abfrage und nichts holen.

Wie das geht, habe ich gefunden in:

Aber ich muss wissen: Wie kann das in Oracle gemacht werden ?

Antworten:


191

Sie können die Tabelle USER_TAB_COLUMNS nach Tabellenspaltenmetadaten abfragen.

SELECT table_name, column_name, data_type, data_length
FROM USER_TAB_COLUMNS
WHERE table_name = 'MYTABLE'

21
Beachten Sie, dass dies spezifisch für Oracle ist.
ConcernedOfTunbridgeWells

8
Gibt es einen Grund, warum dies "keine Zeilen ausgewählt" zurückgeben könnte? (In Oracle.)
Ian R. O'Brien

9
Wenn Sie ‚keine Zeilen ausgewählt‘ haben , dann können Sie zu ändern versuchen USER_TAB_COLUMNSzu all_tab_columns. Um 100% sicher über das Ergebnis zu sein, könnten Sie einen besonderen Besitzer haben.
Dracontis

2
Sie können "ORDER by column_id" hinzufügen, falls Sie sie in derselben Reihenfolge abrufen möchten, in der sie in der Tabelle erstellt wurden. Hier sind einige andere relevante Spaltendaten aus der Tabelle docs.oracle.com/cd/B19306_01/server.102/b14237/…
Bernauer

2
Stellen Sie sicher, dass der Tabellenname in Großbuchstaben angegeben ist.
Hugh Seagraves

67

In SQL Server ...

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

Typ = 'V' für Ansichten Typ = 'U' für Tabellen


39

Du kannst das:

describe EVENT_LOG

oder

desc EVENT_LOG

Hinweis: Nur anwendbar, wenn Sie den Tabellennamen kennen und speziell für Oracle.


26

Für SQL Server 2008 können wir information_schema.columns verwenden, um Spalteninformationen abzurufen

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

1
Beachten Sie, dass die INFORMATION_SCHEMATabellen die ANSI-Standardmetadatentabellen sind. Jedes gute, moderne RDBMS wird sie haben.
Bacon Bits

18

Für SQLite können Sie meines Erachtens Folgendes verwenden:

PRAGMA table_info(table-name);

Erklärung von sqlite.org:

Dieses Pragma gibt eine Zeile für jede Spalte in der benannten Tabelle zurück. Zu den Spalten in der Ergebnismenge gehören der Spaltenname, der Datentyp, ob die Spalte NULL sein kann oder nicht, und der Standardwert für die Spalte. Die Spalte "pk" in der Ergebnismenge ist Null für Spalten, die nicht Teil des Primärschlüssels sind, und der Index der Spalte im Primärschlüssel für Spalten, die Teil des Primärschlüssels sind.

Siehe auch: Sqlite.org Pragma Table Info


1
Ich bin mir nicht sicher, warum ich nicht gewählt wurde, aber ich bin froh, dass es dir geholfen hat.
Shieldstroy

2
Möglicherweise wurde es abgelehnt, weil die Frage mit Oracle gekennzeichnet ist.
Burhan Ali

2
Ich habe das Oracle-Tag entfernt und dies positiv bewertet. Da es so viele Antworten gibt, funktioniert diese Frage besser als eine allgemeine. (Ich kam hierher auf der Suche nach dem mySQL.)
Eiswasser

16

Diese Informationen werden in der ALL_TAB_COLUMNSSystemtabelle gespeichert :

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

DUMMY

Oder Sie könnten DESCRIBEdie Tabelle, wenn Sie SQL * PLUS verwenden:

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

Offizielle Dokumentation ALL_TAB_COLUMNSüber die offizielle Oracle- Datenbankreferenz . Diese Ansicht beschreibt die Spalten der Tabellen, Ansichten und Cluster, auf die der aktuelle Benutzer zugreifen kann.
Mr. Polywhirl

Aber wir können den Schemanamen nicht vor der Tabelle angeben, oder? Zum Beispiel, wenn ich so will select column_name from all_tab_columns where table_name = 'dbo.usertbl';
AhammadaliPK vor

9

Die anderen Antworten beantworten die Frage ausreichend, aber ich dachte, ich würde einige zusätzliche Informationen teilen. Andere beschreiben die Syntax "DESCRIBE table", um die Tabelleninformationen abzurufen. Wenn Sie die Informationen im gleichen Format erhalten möchten, jedoch ohne DESCRIBE, können Sie Folgendes tun:

SELECT column_name as COLUMN_NAME, nullable || '       ' as BE_NULL,
  SUBSTR(data_type || '(' || data_length || ')', 0, 10) as TYPE
 FROM all_tab_columns WHERE table_name = 'TABLENAME';

Wahrscheinlich spielt es keine Rolle, aber ich habe es früher geschrieben und es scheint zu passen.


Incorrect Syntax near '|'
Wenn

4

Für Oracle

SELECT column_name FROM user_tab_cols WHERE table_name=UPPER('tableName');

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

Funktioniert diese Abfrage unter Angabe eines Spaltennamens und eines Sterns - "Spaltenname auswählen, *". Sie funktioniert nicht in Oracle.
Teja

3
describe YOUR_TABLE;

In deinem Fall :

describe EVENT_LOG;

3

Verwenden Sie für MySQL

SELECT column_name 
FROM information_schema.columns 
WHERE 
table_schema = 'Schema' AND table_name = 'Table_Name'

3

Auch dies ist eine der Möglichkeiten, wie wir es verwenden können

select * from product where 1 != 1

2

Für SQL Server:

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

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

Willkommen bei Stack Overflow @expert one. Auch wenn Ihre Antwort korrekt zu sein scheint, fügen Sie bitte mehr Details und Erklärungen hinzu als juste 'code'. Es wäre für alle klarer.
Jean-Rémy Revy

1

Sie können dies auch versuchen, aber es sind möglicherweise mehr Informationen als Sie benötigen:

sp_columns TABLE_NAME

1

MySQL

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

Dies ergibt ein Ergebnis wie das folgende:

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

Dann können Sie die Werte einfach herausziehen

fetch row[0]

Dies ist auch ideal für die dynamische Übergabe von Eingaben, da der REGEXP das '|' benötigt. für mehrere Eingaben, ist aber auch eine Möglichkeit, Daten getrennt zu halten und einfach zu speichern / an Klassen / Funktionen zu übergeben.

Versuchen Sie, aus Sicherheitsgründen beim Senden auch Dummy-Daten einzugeben, und vergleichen Sie, was beim Empfang von Fehlern zurückgegeben wurde.


1

In Oracle gibt es zwei Ansichten, die Spalten beschreiben:

  • DBA_TAB_COLUMNS beschreibt die Spalten aller Tabellen, Ansichten und Cluster in der Datenbank.

  • USER_TAB_COLUMNS beschreibt die Spalten der Tabellen, Ansichten und
    Cluster, die dem aktuellen Benutzer gehören. In dieser Ansicht wird die
    Spalte EIGENTÜMER nicht angezeigt .


0

Die Antwort ist hier: http://php.net/manual/en/function.mysql-list-fields.php Ich würde in Ihrem Fall den folgenden Code verwenden:

$result = mysql_query("SHOW COLUMNS FROM sometable");
if (!$result) {
    echo 'Could not run query: ' . mysql_error();
    exit;
}
$fields = array();
if (mysql_num_rows($result) > 0) {
    while ($row = mysql_fetch_assoc($result)) {
        $fields[] = $row['Field'];
    }
}

0
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'

0

Sie können diese Abfrage ausführen

SELECT t.name AS table_name,
SCHEMA_NAME(schema_id) AS schema_name,
c.name AS column_name
FROM sys.tables AS t
INNER JOIN sys.columns c ON t.OBJECT_ID = c.OBJECT_ID
WHERE c.name LIKE '%%' --if you want to find specific column write here 
ORDER BY schema_name, table_name;

-1

Wählen Sie einfach die erste Zeile aus der Tabelle für Orakel: select * from <table name> where rownum = 1;


Wofür steht Rownum? Muss ich eine Spalte mit dem Namen rownum verwenden?
Merve Bıçakçı


-1

Versuche dies

select * from sys.all_columns c join sys.objects o on c.object_id=o.object_id where o.name = 'TABLENAME' and c.name like '%COLUMN NAME%'


-3
SELECT COLUMN_NAME 
FROM YourDatabase.INFORMATION_SCHEMA.COLUMNS 
WHERE TABLE_NAME = 'YourTableName'
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.