it-swarm.com.de

Oracle-Abfrage zum Abrufen von Spaltennamen

Ich habe eine MySQL-Abfrage, um Spalten aus einer Tabelle wie folgt 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 Tabellenbenutzer erhalten, wobei bestimmte Spalten ausgenommen sind und ein Schema angegeben wird. Im Moment habe ich alle Tabellen in meinem neuen Tablespace, also gebe ich den Namen des Tablespaces anstelle des Schemanamens an?

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

98
pri_dev

Das Oracle-Äquivalent für information_schema.COLUMNS ist USER_TAB_COLS für Tabellen, die dem aktuellen Benutzer gehören, ALL_TAB_COLS oder DBA_TAB_COLS für Tabellen, die allen Benutzern gehören.

Der Tablespace entspricht keinem Schema, und Sie müssen auch keinen Namen für den Tablespace angeben.

Die Angabe des Schemas/des Benutzernamens wäre nützlich, wenn Sie ALL_TAB_COLS oder DBA_TAB_COLS für Spalten von Tabellen abfragen möchten, deren Eigner ein bestimmter Benutzer ist. 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 die SQL-Injection riskieren.

EDIT: Die Tabellen- und Spaltennamen sind in Großbuchstaben angegeben, da diese in Oracle normalerweise in Großbuchstaben geschrieben werden. Sie sind nur in Groß- oder Kleinschreibung angegeben, wenn sie in Anführungszeichen gesetzt werden.

142
Sathyajith Bhat

Die unten stehende Abfrage funktionierte für mich in der Oracle-Datenbank.

select COLUMN_NAME from ALL_TAB_COLUMNS where TABLE_NAME='MyTableName';
85
Karthik N G

in Oracle können Sie verwenden 

desc users

um alle Spalten anzuzeigen, die in der Benutzertabelle enthalten sind

34
Arsalan Sheikh

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 vom Benutzer zugelassene Tabellenspalten.)

select  COLUMN_NAME  from user_tab_columns
where table_name='test_tbl'; 

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
MrElbow

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

Habe noch nie von HQL für solche Abfragen gehört. Ich gehe davon aus, dass es für ORM-Implementierungen keinen Sinn macht, sich damit zu befassen. ORM ist ein objektrelationales Mapping, und Sie suchen nach Metadaten-Mapping ... Sie würden HQL nicht verwenden, sondern API-Methoden für diesen Zweck 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 unter Oracle doc .

2
yair

Bei mehreren Gelegenheiten würden wir eine durch Kommas getrennte Liste aller Spalten aus einer Tabelle in einem Schema benötigen. 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 die Funktion einfach aus der Abfrage aufrufen, wird eine Zeile mit allen Spalten angezeigt.

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 4000 Zeichen überschreitet, was selten ist. In den meisten Fällen wird dies funktionieren.

0
Kaushik Nayak

Sie können dies versuchen:

beschreibe 'Tabellenname'

Es werden alle Spaltennamen und Datentypen zurückgegeben

0
Reza Rahimi

der Punkt ist, dass in der Kröte Sie Tabellennamen wie folgt schreiben müssen:

select *
FROM all_tab_columns
where table_name like 'IDECLARATION';
0
Ghadir Farzaneh

Ich finde das 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;
0
Dave C.
  1. SELECT * FROM <SCHEMA_NAME.TABLE_NAME> WHERE ROWNUM = 0; -> Beachten Sie, dass dies ein Ergebnis der Abfrage ist, ein ResultSet. Dies ist in andere Formate exportierbar . Sie können auch das Abfrageergebnis in das Text-Format exportieren. Der Export sieht wie folgt aus, als ich SELECT * FROM SATURN.SPRIDEN WHERE ROWNUM = 0; getan habe: 

    "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.

0
Uddhav Gautam