Kueri Oracle untuk mengambil nama kolom

123

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?)

pri_dev
sumber

Jawaban:

176

Persamaan Oracle untuk information_schema.COLUMNSadalah USER_TAB_COLSuntuk tabel yang dimiliki oleh pengguna saat ini, ALL_TAB_COLSatau DBA_TAB_COLSuntuk tabel yang dimiliki oleh semua pengguna.

Tablespace tidak setara dengan skema, Anda juga tidak harus memberikan nama tablespace.

Memberikan skema / nama pengguna akan berguna jika Anda ingin melakukan kueri ALL_TAB_COLSatau DBA_TAB_COLSuntuk kolom OF tabel yang dimiliki oleh pengguna tertentu. dalam kasus Anda, saya membayangkan kueri akan terlihat seperti ini:

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

Perhatikan bahwa dengan pendekatan ini, Anda berisiko terkena injeksi SQL.

EDIT: Huruf besar nama tabel dan kolom karena ini biasanya huruf besar di Oracle; hanya huruf kecil atau campuran jika dibuat dengan tanda kutip ganda di sekitarnya.

Sathyajith Bhat
sumber
2
ngomong-ngomong saya menemukan cara umum untuk melakukan ini terlepas dari basis data melalui jdbc .. dengan tautan di sini: kodejava.org/examples/163.html
pri_dev
Saya juga harus menambahkan and virtual_column = 'NO'kueri saya.
musicin3d
101

Kueri di bawah ini berfungsi untuk saya di database Oracle.

select COLUMN_NAME from ALL_TAB_COLUMNS where TABLE_NAME='MyTableName';
Karthik NG
sumber
26
Perlu diingat bahwa Oracle peka huruf besar / kecil. Saya biasanya menggunakan ...WHERE LOWER(Table_Name) = 'mytablename';.
2
@ user565869 Saya akan menggunakan where lower(TABLE_NAME) = lower('WHATEVER'), kalau tidak nama tabel memiliki beberapa karakter huruf besar itu tidak akan menemukan tabel juga
AlexanderD
SELECT column_name FROM all_tab_cols WHERE UPPER(Table_Name) = UPPER('tablename');bekerja dengan baik.
pengguna3553260
Menggunakan lower(TABLE_NAME)atau upper(TABLE_NAME)membutuhkan oracle untuk melakukan scan tabel dari ALL_TAB_COLUMNStabel untuk mendapatkan semua nilai TABLE_NAMEsebelum dapat membandingkannya dengan yang disediakan UPPER('MyTableName'). Dalam pengujian cepat, ini membuat kinerja tidak dapat digunakan untuk tujuan saya, jadi saya akan tetap menggunakan perbandingan case-sensitive.
Chris Magnuson
40

di oracle yang bisa Anda gunakan

desc users

untuk menampilkan semua kolom yang ada di tabel pengguna

Arsalan Sheikh
sumber
6
... karena meskipun ini mewakili jawaban untuk 'cara mendapatkan daftar semua kolom tabel', itu tidak menjawab pertanyaan yang ditanyakan: 1) ini bukan kueri, 2) itu tidak membatasi / memfilter kolom yang dikembalikan, 3) apakah mengembalikan set hasil?
Ehryk
6
Kurangnya suara positif tidak membuat desc usersjawaban yang buruk untuk beberapa pertanyaan, tetapi itu bukan jawaban yang baik untuk pertanyaan ini .
Ehryk
dan karena ini bukan query sql, melainkan perintah sql * plus.
periksa
7

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)

select  COLUMN_NAME  from user_tab_columns
where table_name='test_tbl'; 

Md. Salman Fahad Terkenal
sumber
1
USER_TAB_COLUMNSsebenarnya adalah kolom tabel yang dimiliki oleh pengguna, bukan kolom tabel yang diizinkan untuk pengguna.
David Faber
2

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 .

yair
sumber
TABLE_NAME='"+_db+".users'akan gagal; Anda perlu memisahkan pemilik / skema dan nama tabel diALL_TAB_COLUMNS
David Faber
2

Satu-satunya cara saya bisa mendapatkan nama kolom adalah menggunakan kueri berikut:

select COLUMN_NAME
FROM all_tab_columns atc
WHERE table_name like 'USERS'
Altan
sumber
2

intinya di kodok kamu harus menulis nama tabel dengan huruf kapital, seperti ini:

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

Saya menemukan yang ini berguna di Oracle:

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;
Dave C.
sumber
Jawaban ini sangat sulit untuk dibaca. Harap pertimbangkan untuk memformat ulang.
chharvey
Bagaimana jika ada beberapa tabel dengan nama yang sama, tetapi pemilik berbeda?
David Faber
1

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.

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

Jadi, cukup memanggil fungsi dari kueri akan menghasilkan satu baris dengan semua kolom.

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

Catatan: LISTAGG akan gagal jika panjang gabungan semua kolom melebihi 4000karakter yang jarang terjadi. Untuk kebanyakan kasus, ini akan berhasil.

Kaushik Nayak
sumber
0
  1. 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 ke Textformat. Ekspor terlihat seperti di bawah ini ketika saya melakukannya 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> -> Catatan: Ini adalah keluaran skrip.

Uddhav Gautam
sumber
-1

Anda dapat menggunakan kueri di bawah ini untuk mendapatkan daftar nama tabel yang menggunakan kolom tertentu di DB2:

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

Catatan: Di sini ganti COLUMN_NAMEdengan nama kolom yang Anda cari.

Arulazagan Rathinam Infosys
sumber
Mungkin Anda harus mencari pertanyaan DB2 untuk dijawab? Saya ragu seseorang yang mencari Oracle akan membutuhkan jawaban DB2.
RichardTheKiwi
1
Jawaban ini benar-benar membantu saya. Saya menggunakan DB2 dalam mode Oracle dan tidak mendukung all_tab_cols.
wm_eddie
-1

Anda dapat mencoba ini:

jelaskan 'Nama Tabel'

Ini akan mengembalikan semua nama kolom dan tipe data

Reza Rahimi
sumber