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?)
and virtual_column = 'NO'
zu meiner Anfrage hinzufügen .Die folgende Abfrage hat bei mir in der Oracle-Datenbank funktioniert.
quelle
...WHERE LOWER(Table_Name) = 'mytablename';
.where lower(TABLE_NAME) = lower('WHATEVER')
, sonst, wenn der Tabellenname ein Großbuchstaben hat, wird er die Tabelle auch nicht findenSELECT column_name FROM all_tab_cols WHERE UPPER(Table_Name) = UPPER('tablename');
funktioniert genauso gut.lower(TABLE_NAME)
oderupper(TABLE_NAME)
erfordert Oracle, um einen Tabellenscan der Tabelle durchzuführenALL_TAB_COLUMNS
, um alle Werte zu erhalten,TABLE_NAME
bevor sie mit den angegebenen Werten verglichen werden könnenUPPER('MyTableName')
. Beim schnellen Testen wurde die Leistung für meinen Zweck unbrauchbar, sodass ich mich an Vergleiche zwischen Groß- und Kleinschreibung halten werde.in Orakel können Sie verwenden
um alle Spalten anzuzeigen, die in der Benutzertabelle enthalten sind
quelle
desc users
schlechte Antwort auf einige Fragen, aber keine gute Antwort auf diese Frage .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.)
quelle
USER_TAB_COLUMNS
ist eigentlich die Spalte der Tabellen, die dem Benutzer gehört, nicht die der Tabellen, die dem Benutzer gestattet sind.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 .
quelle
TABLE_NAME='"+_db+".users'
wird versagen; Sie müssen Eigentümer / Schema und Tabellennamen inALL_TAB_COLUMNS
Die einzige Möglichkeit, die Spaltennamen abzurufen, war die folgende Abfrage:
quelle
Der Punkt ist, dass Sie in Kröte das Tabellennamen-Kapital wie folgt schreiben müssen:
quelle
Ich finde dieses in Oracle nützlich:
quelle
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.
Wenn Sie also einfach die Funktion aus der Abfrage aufrufen, erhalten Sie eine Zeile mit allen Spalten.
Hinweis:
LISTAGG
schlägt fehl, wenn die kombinierte Länge aller Spalten4000
Zeichen überschreitet , was selten vorkommt. In den meisten Fällen funktioniert dies.quelle
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 dasText
Format exportieren . Der Export sieht wie folgt ausSELECT * 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 "
DESCRIBE <TABLE_NAME>
-> Hinweis: Dies ist eine Skriptausgabe.quelle
Mit der folgenden Abfrage können Sie eine Liste der Tabellennamen abrufen, die die spezifische Spalte in DB2 verwenden:
Hinweis: Ersetzen Sie hier den
COLUMN_NAME
durch den gesuchten Spaltennamen.quelle
Sie können dies versuchen:
Beschreibe 'Tabellenname'
Es werden alle Spaltennamen und Datentypen zurückgegeben
quelle