Saya memiliki kueri mySQL untuk mendapatkan kolom dari tabel seperti ini:
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')"
Bagaimana cara mengubah kueri di atas dalam database Oracle 11g? Saya perlu mendapatkan nama kolom sebagai kumpulan hasil untuk tabel 'pengguna' tidak termasuk kolom tertentu, menentukan skema. Saat ini saya memiliki semua tabel di tablespace baru saya, jadi apakah saya menentukan nama tablespace sebagai pengganti nama skema?
Juga apakah ada HQL generik untuk ini? Dalam database Oracle baru saya (saya baru mengenal Oracle), saya hanya memiliki nama tablespace, jadi apakah itu setara dengan nama skema (secara logis?)
and virtual_column = 'NO'
kueri saya.Kueri di bawah ini berfungsi untuk saya di database Oracle.
sumber
...WHERE LOWER(Table_Name) = 'mytablename';
.where lower(TABLE_NAME) = lower('WHATEVER')
, kalau tidak nama tabel memiliki beberapa karakter huruf besar itu tidak akan menemukan tabel jugaSELECT column_name FROM all_tab_cols WHERE UPPER(Table_Name) = UPPER('tablename');
bekerja dengan baik.lower(TABLE_NAME)
atauupper(TABLE_NAME)
membutuhkan oracle untuk melakukan scan tabel dariALL_TAB_COLUMNS
tabel untuk mendapatkan semua nilaiTABLE_NAME
sebelum dapat membandingkannya dengan yang disediakanUPPER('MyTableName')
. Dalam pengujian cepat, ini membuat kinerja tidak dapat digunakan untuk tujuan saya, jadi saya akan tetap menggunakan perbandingan case-sensitive.di oracle yang bisa Anda gunakan
untuk menampilkan semua kolom yang ada di tabel pengguna
sumber
desc users
jawaban yang buruk untuk beberapa pertanyaan, tetapi itu bukan jawaban yang baik untuk pertanyaan ini .Anda dapat mencoba ini: (Ini bekerja pada 11g dan mengembalikan semua nama kolom dari tabel, di sini test_tbl adalah nama tabel dan user_tab_columns adalah kolom tabel yang diizinkan pengguna)
sumber
USER_TAB_COLUMNS
sebenarnya adalah kolom tabel yang dimiliki oleh pengguna, bukan kolom tabel yang diizinkan untuk pengguna.Kueri yang akan digunakan dengan Oracle adalah:
String sqlStr="select COLUMN_NAME from ALL_TAB_COLUMNS where TABLE_NAME='"+_db+".users' and COLUMN_NAME not in ('password','version','id')"
Belum pernah mendengar tentang HQL untuk kueri semacam itu. Saya menganggap tidak masuk akal untuk implementasi ORM untuk menghadapinya. ORM adalah Pemetaan Relasional Objek, dan yang Anda cari adalah pemetaan metadata ... Anda tidak akan menggunakan HQL, lebih baik gunakan metode API untuk tujuan ini, atau SQL langsung. Misalnya, Anda dapat menggunakan JDBC DatabaseMetaData .
Saya pikir tablespace tidak ada hubungannya dengan skema. Ruang tabel AFAIK terutama digunakan untuk tujuan teknis internal logis yang seharusnya mengganggu DBA. Untuk informasi lebih lanjut tentang tablespaces, lihat dokumen Oracle .
sumber
TABLE_NAME='"+_db+".users'
akan gagal; Anda perlu memisahkan pemilik / skema dan nama tabel diALL_TAB_COLUMNS
Satu-satunya cara saya bisa mendapatkan nama kolom adalah menggunakan kueri berikut:
sumber
intinya di kodok kamu harus menulis nama tabel dengan huruf kapital, seperti ini:
sumber
Saya menemukan yang ini berguna di Oracle:
sumber
Pada beberapa kesempatan, kita membutuhkan daftar yang dipisahkan koma dari semua kolom dari tabel dalam skema. Dalam kasus seperti itu kita dapat menggunakan fungsi umum ini yang mengambil daftar yang dipisahkan koma sebagai string.
Jadi, cukup memanggil fungsi dari kueri akan menghasilkan satu baris dengan semua kolom.
Catatan:
LISTAGG
akan gagal jika panjang gabungan semua kolom melebihi4000
karakter yang jarang terjadi. Untuk kebanyakan kasus, ini akan berhasil.sumber
SELECT * FROM <SCHEMA_NAME.TABLE_NAME> WHERE ROWNUM = 0;
-> Perhatikan bahwa, ini adalah Hasil Kueri, sebuah ResultSet. Ini dapat diekspor ke format lain. Dan, Anda dapat mengekspor Hasil Kueri keText
format. Ekspor terlihat seperti di bawah ini ketika saya melakukannyaSELECT * 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>
-> Catatan: Ini adalah keluaran skrip.sumber
Anda dapat menggunakan kueri di bawah ini untuk mendapatkan daftar nama tabel yang menggunakan kolom tertentu di DB2:
Catatan: Di sini ganti
COLUMN_NAME
dengan nama kolom yang Anda cari.sumber
Anda dapat mencoba ini:
jelaskan 'Nama Tabel'
Ini akan mengembalikan semua nama kolom dan tipe data
sumber