Oracle-Abfrage zum Abrufen von Spaltennamen


123

Ich habe eine mySQL-Abfrage, um Spalten aus einer Tabelle wie dieser abzurufen:

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

Wie ändere ich die obige Abfrage in der Oracle 11g-Datenbank? Ich muss Spaltennamen als Ergebnismenge für die Tabelle 'Benutzer' abrufen, wobei bestimmte Spalten ausgeschlossen sind und ein Schema angegeben wird. Im Moment habe ich alle Tabellen in meinem neuen Tabellenbereich. Geben Sie also anstelle des Schemanamens den Namen des Tabellenbereichs an?

Gibt es auch eine generische HQL dafür? In meiner neuen Oracle-Datenbank (ich bin neu bei Oracle) habe ich nur den Tabellenbereichsnamen. Entspricht dieser also dem Schemanamen (logisch?)

Antworten:


176

Das Oracle-Äquivalent für information_schema.COLUMNSgilt USER_TAB_COLSfür Tabellen, die dem aktuellen Benutzer gehören, ALL_TAB_COLSoder DBA_TAB_COLSfür Tabellen, die allen Benutzern gehören.

Der Tablespace entspricht weder einem Schema noch müssen Sie den Tablespace-Namen angeben.

Die Bereitstellung der schema / würde Benutzername von Nutzen sein , wenn Sie abfragen möchten ALL_TAB_COLSoder DBA_TAB_COLSfür Spalten von einem bestimmten Benutzer gehören Tabellen. In Ihrem Fall würde ich mir vorstellen, dass die Abfrage ungefähr so ​​aussehen würde:

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

Beachten Sie, dass Sie bei diesem Ansatz das Risiko einer SQL-Injection eingehen.

BEARBEITEN : Groß- und Kleinschreibung der Tabellen- und Spaltennamen, da diese in Oracle normalerweise in Großbuchstaben geschrieben sind. Sie werden nur in Klein- oder Großbuchstaben geschrieben, wenn sie mit doppelten Anführungszeichen versehen sind.


2
Übrigens habe ich über jdbc einen generischen Weg gefunden, dies unabhängig von der Datenbank zu tun. Mit dem Link hier: kodejava.org/examples/163.html
pri_dev

Ich musste auch and virtual_column = 'NO'zu meiner Anfrage hinzufügen .
musicin3d

101

Die folgende Abfrage hat bei mir in der Oracle-Datenbank funktioniert.

select COLUMN_NAME from ALL_TAB_COLUMNS where TABLE_NAME='MyTableName';

26
Beachten Sie, dass bei Oracle zwischen Groß- und Kleinschreibung unterschieden wird. Ich benutze normalerweise ...WHERE LOWER(Table_Name) = 'mytablename';.

2
@ user565869 Ich würde verwenden where lower(TABLE_NAME) = lower('WHATEVER'), sonst, wenn der Tabellenname ein Großbuchstaben hat, wird er die Tabelle auch nicht finden
AlexanderD

SELECT column_name FROM all_tab_cols WHERE UPPER(Table_Name) = UPPER('tablename');funktioniert genauso gut.
user3553260

Verwenden lower(TABLE_NAME)oder upper(TABLE_NAME)erfordert Oracle, um einen Tabellenscan der Tabelle durchzuführen ALL_TAB_COLUMNS, um alle Werte zu erhalten, TABLE_NAMEbevor sie mit den angegebenen Werten verglichen werden können UPPER('MyTableName'). Beim schnellen Testen wurde die Leistung für meinen Zweck unbrauchbar, sodass ich mich an Vergleiche zwischen Groß- und Kleinschreibung halten werde.
Chris Magnuson

40

in Orakel können Sie verwenden

desc users

um alle Spalten anzuzeigen, die in der Benutzertabelle enthalten sind


6
... weil es zwar eine Antwort auf "Wie man eine Liste aller Spalten einer Tabelle erhält" darstellt, aber die gestellte Frage nicht beantwortet: 1) es ist keine Abfrage, 2) es beschränkt / nicht Filtern Sie die zurückgegebenen Spalten. 3) Gibt es eine Ergebnismenge zurück?
Ehryk

6
Das Fehlen von Upvotes ist keine desc usersschlechte Antwort auf einige Fragen, aber keine gute Antwort auf diese Frage .
Ehryk

und weil es keine SQL-Abfrage ist, sondern der Befehl sql * plus. Weitere Informationen finden Sie hier: stackoverflow.com/questions/37133666/…
01000001

7

Sie können Folgendes versuchen: (Es funktioniert mit 11g und gibt alle Spaltennamen aus einer Tabelle zurück. Hier ist test_tbl der Tabellenname und user_tab_columns sind die Spalten der vom Benutzer zugelassenen Tabelle.)

select  COLUMN_NAME  from user_tab_columns
where table_name='test_tbl'; 


1
USER_TAB_COLUMNSist eigentlich die Spalte der Tabellen, die dem Benutzer gehört, nicht die der Tabellen, die dem Benutzer gestattet sind.
David Faber

2

Die mit Oracle zu verwendende Abfrage lautet:

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

Ich habe noch nie von HQL für solche Anfragen gehört. Ich gehe davon aus, dass es für ORM-Implementierungen keinen Sinn macht, damit umzugehen. ORM ist eine objektrelationale Zuordnung, und Sie suchen nach einer Metadatenzuordnung ... Sie würden kein HQL verwenden, sondern API-Methoden für diesen Zweck verwenden oder direktes SQL. Beispielsweise können Sie JDBC DatabaseMetaData verwenden .

Ich denke, Tablespace hat nichts mit Schema zu tun. AFAIK-Tablespaces werden hauptsächlich für logische interne technische Zwecke verwendet, die DBAs stören sollten. Weitere Informationen zu Tablespaces finden Sie im Oracle-Dokument .


TABLE_NAME='"+_db+".users'wird versagen; Sie müssen Eigentümer / Schema und Tabellennamen inALL_TAB_COLUMNS
David Faber

2

Die einzige Möglichkeit, die Spaltennamen abzurufen, war die folgende Abfrage:

select COLUMN_NAME
FROM all_tab_columns atc
WHERE table_name like 'USERS'

2

Der Punkt ist, dass Sie in Kröte das Tabellennamen-Kapital wie folgt schreiben müssen:

select *
FROM all_tab_columns
where table_name like 'IDECLARATION';

1

Ich finde dieses in Oracle nützlich:

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;

Diese Antwort ist sehr schwer zu lesen. Bitte beachten Sie eine Neuformatierung.
Chharvey

Was ist, wenn mehrere Tabellen mit demselben Namen, aber unterschiedlichen Eigentümern vorhanden sind?
David Faber

1

Bei mehreren Gelegenheiten benötigen wir eine durch Kommas getrennte Liste aller Spalten aus einer Tabelle in einem Schema. In solchen Fällen können wir diese generische Funktion verwenden, die die durch Kommas getrennte Liste als Zeichenfolge abruft.

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

Wenn Sie also einfach die Funktion aus der Abfrage aufrufen, erhalten Sie eine Zeile mit allen Spalten.

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

Hinweis: LISTAGG schlägt fehl, wenn die kombinierte Länge aller Spalten 4000Zeichen überschreitet , was selten vorkommt. In den meisten Fällen funktioniert dies.


0
  1. SELECT * FROM <SCHEMA_NAME.TABLE_NAME> WHERE ROWNUM = 0;-> Beachten Sie, dass dies das Abfrageergebnis ist, ein ResultSet. Dies kann in andere Formate exportiert werden. Außerdem können Sie das Abfrageergebnis in das TextFormat exportieren . Der Export sieht wie folgt aus 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> -> Hinweis: Dies ist eine Skriptausgabe.


-1

Mit der folgenden Abfrage können Sie eine Liste der Tabellennamen abrufen, die die spezifische Spalte in DB2 verwenden:

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

Hinweis: Ersetzen Sie hier den COLUMN_NAMEdurch den gesuchten Spaltennamen.


Vielleicht sollten Sie nach DB2-Fragen suchen, um sie zu beantworten? Ich bezweifle, dass jemand, der nach Oracle sucht, eine DB2-Antwort benötigt.
RichardTheKiwi

1
Diese Antwort hat mir tatsächlich geholfen. Ich verwende DB2 im Oracle-Modus und es unterstützt nicht all_tab_cols.
wm_eddie

-1

Sie können dies versuchen:

Beschreibe 'Tabellenname'

Es werden alle Spaltennamen und Datentypen zurückgegeben

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.