Dapatkan daftar semua tabel di Oracle?

1102

Bagaimana cara saya meminta database Oracle untuk menampilkan nama-nama semua tabel di dalamnya?

vitule
sumber
1
Apakah SHOW TABLES(seperti yang dilakukan pada MySQL) berfungsi?
Martin Thoma
1
@MartinThoma tidak. mencobanya dulu, sebelum beralih ke Google
Adam Burley

Jawaban:

1364
SELECT owner, table_name
  FROM dba_tables

Ini dengan asumsi bahwa Anda memiliki akses ke DBA_TABLEStampilan kamus data. Jika Anda tidak memiliki hak istimewa itu tetapi membutuhkannya, Anda dapat meminta DBA secara eksplisit memberi Anda hak istimewa pada tabel itu, atau, bahwa DBA memberi Anda SELECT ANY DICTIONARYhak istimewa atau SELECT_CATALOG_ROLEperan (yang keduanya memungkinkan Anda untuk menanyakan tabel kamus data apa pun) ). Tentu saja, Anda mungkin ingin mengecualikan skema tertentu seperti SYSdan SYSTEMyang memiliki banyak tabel Oracle yang mungkin tidak Anda pedulikan.

Atau, jika Anda tidak memiliki akses ke DBA_TABLES, Anda dapat melihat semua tabel yang memiliki akses akun Anda melalui ALL_TABLEStampilan:

SELECT owner, table_name
  FROM all_tables

Meskipun, itu mungkin subset dari tabel yang tersedia di database (ALL_TABLES menunjukkan kepada Anda informasi untuk semua tabel yang telah diberikan akses oleh pengguna Anda).

Jika Anda hanya mementingkan tabel yang Anda miliki, bukan tabel yang bisa Anda akses, Anda bisa menggunakan USER_TABLES:

SELECT table_name
  FROM user_tables

Karena USER_TABLEShanya memiliki informasi tentang tabel yang Anda miliki, itu tidak memiliki OWNERkolom - pemiliknya, menurut definisi, adalah Anda.

Oracle juga memiliki sejumlah data warisan kamus views-- TAB, DICT, TABS, dan CATuntuk misalnya-- yang dapat digunakan. Secara umum, saya tidak akan menyarankan menggunakan tampilan warisan ini kecuali jika Anda benar-benar perlu untuk membuat cadangan skrip Anda ke Oracle 6. Oracle tidak mengubah pandangan ini dalam waktu yang lama sehingga mereka sering mengalami masalah dengan jenis objek yang lebih baru. Misalnya, TABdan CATtampilan keduanya menampilkan informasi tentang tabel yang ada di tempat sampah pengguna sementara [DBA|ALL|USER]_TABLEStampilan semua memfilternya. CATjuga menunjukkan informasi tentang log tampilan terwujud dengan TABLE_TYPE"TABEL" yang tidak mungkin apa yang Anda inginkan. DICTmenggabungkan tabel dan sinonim dan tidak memberi tahu Anda siapa yang memiliki objek.

Gua Justin
sumber
9
Saya mendapat pengecualian "ORA-00942: tabel atau tampilan tidak ada"
vitule
46
Maka Anda belum diberi izin untuk melihat semua tabel dalam database. Anda dapat meminta tampilan kamus data ALL_TABLES untuk melihat semua tabel yang diizinkan untuk Anda akses, yang mungkin merupakan subset kecil dari tabel dalam database.
Justin Cave
Kesalahan sederhana jika bukan pengguna sqlplus sehari-hari: tambahkan semi-colon akhir (';') jika Anda tidak mendapatkan hasil dengan perintah di atas :).
Gimhani
Perhatikan bahwa pada Oracle 12c, ada kolom di kamus data dba_users untuk membantu menghapus tabel sistem dari hasil yang Anda set. Query lengkapnya adalah SELECT owner, table_name dari dba_tables yang pemiliknya tidak ada (pilih username dari dba_users di mana oracle_maintained = 'Y')
saritonin
181

Meminta user_tablesdan dba_tablestidak bekerja.
Yang ini:

select table_name from all_tables  
vitule
sumber
14
@LimitedAtonement Maaf, itu salah. Tampilan disebut user_tables, bukan user_table. Jika user_tables tidak berfungsi untuk vitule, sesuatu yang lain salah.
Frank Schmitt
67

Selangkah lebih maju, ada tampilan lain yang disebut cols (all_tab_columns) yang dapat digunakan untuk memastikan tabel mana yang berisi nama kolom yang diberikan.

Sebagai contoh:

SELECT table_name, column_name
FROM cols
WHERE table_name LIKE 'EST%'
AND column_name LIKE '%CALLREF%';

untuk menemukan semua tabel yang memiliki nama yang dimulai dengan EST dan kolom yang berisi CALLREF di mana saja dalam nama mereka.

Ini dapat membantu saat menentukan kolom yang ingin Anda gabungkan, misalnya, tergantung pada konvensi penamaan tabel dan kolom Anda.

stealth_angoid
sumber
4
Saya lakukan select * from colsdan mendapat 0 baris dikembalikan.
Gabe
50

Untuk tampilan yang lebih baik bersama sqlplus

Jika Anda menggunakan, sqlplusAnda mungkin ingin terlebih dahulu menyiapkan beberapa parameter untuk tampilan yang lebih baik jika kolom Anda menjadi berantakan (variabel-variabel ini tidak akan bertahan setelah Anda keluar dari sqlplussesi Anda ):

set colsep '|'
set linesize 167
set pagesize 30
set pagesize 1000

Tampilkan Semua Tabel

Anda kemudian dapat menggunakan sesuatu seperti ini untuk melihat semua nama tabel:

SELECT table_name, owner, tablespace_name FROM all_tables;

Tampilkan Tabel yang Anda Miliki

Seperti @Justin Cave menyebutkan, Anda dapat menggunakan ini untuk hanya menampilkan tabel yang Anda miliki:

SELECT table_name FROM user_tables;

Jangan Lupakan Tampilan

Ingatlah bahwa beberapa "tabel" mungkin sebenarnya adalah "tampilan" sehingga Anda juga dapat mencoba menjalankan sesuatu seperti:

SELECT view_name FROM all_views;

Hasil

Ini akan menghasilkan sesuatu yang terlihat cukup dapat diterima seperti:

hasil

cwd
sumber
8
terima kasih atas saran "melihat lebih baik", tetapi tidak Anda overwritting pagesize 30dengan pagesize 1000?
Pablo Recalde
22

Permintaan sederhana untuk memilih tabel untuk pengguna saat ini:

  SELECT table_name FROM user_tables;
Israel Margulies
sumber
18
    select object_name from user_objects where object_type='TABLE';

----------------ATAU------------------

    select * from tab;

----------------ATAU------------------

    select table_name from user_tables;
Harshil
sumber
15

Coba tampilan kamus data di bawah ini.

tabs
dba_tables
all_tables
user_tables
Mahmoud Ahmed El-Sayed
sumber
9

Coba pilih dari user_tables yang berisi daftar tabel yang dimiliki oleh pengguna saat ini.

Eddie Awad
sumber
8

Dengan semua itu, Anda dapat memilih:

SELECT DISTINCT OWNER, OBJECT_NAME 
    FROM DBA_OBJECTS 
    WHERE OBJECT_TYPE = 'TABLE' AND OWNER='SOME_SCHEMA_NAME';

SELECT DISTINCT OWNER, OBJECT_NAME 
    FROM ALL_OBJECTS 
    WHERE OBJECT_TYPE = 'TABLE' AND OWNER='SOME_SCHEMA_NAME';
Van Gogh
sumber
6
select * from dba_tables

memberikan semua tabel dari semua pengguna hanya jika pengguna yang Anda masuki memiliki sysdbahak istimewa.

praveen2609
sumber
4
Itu sebenarnya tidak benar. SYSDBA tidak diperlukan. Anda bisa mendapatkan akses ke DBA_TABLES dengan banyak cara. 1.) Hibah langsung pada objek ke pengguna oleh SYS. 2.) Berikan PILIHAN KELEBIHAN KHUSUS kepada pengguna. 3.) Memberikan peran SELECT_CATALOG_ROLE.
Mark J. Bobak
4

Saya tidak menemukan jawaban yang akan digunakan

DBA_ALL_TABLES (ALL_ALL_TABLES/USER_ALL_TABLES)

jadi memutuskan untuk menambahkan versi saya juga. Tampilan ini sebenarnya mengembalikan lebih banyak dari DBA_TABLES karena mengembalikan tabel objek juga ( http://docs.oracle.com/cd/E11882_01/server.112/e40402/statviews_1003.htm ).

Berkarat
sumber
4

Anda dapat menggunakan Kamus Data Oracle untuk mendapatkan informasi tentang objek oracle.

Anda bisa mendapatkan daftar tabel dengan berbagai cara:

select * 
from dba_tables

atau misalnya:

select * 
from dba_objects 
where object_type = 'TABLE' 

Kemudian Anda bisa mendapatkan kolom tabel menggunakan nama tabel:

select * 
from dba_tab_columns

Kemudian Anda bisa mendapatkan daftar dependensi (pemicu, tampilan, dll.):

select * 
from dba_dependencies
where referenced_type='TABLE' and referenced_name=:t_name 

Kemudian Anda bisa mendapatkan sumber teks dari objek ini:

select * from dba_source

Dan Anda dapat menggunakan USERatau ALLmelihat alih-alih DBAjika Anda mau.

Slava Babin
sumber
4

Termasuk tampilan:

SELECT owner, table_name as table_view
  FROM dba_tables
UNION ALL
SELECT owner, view_name as table_view
  FROM DBA_VIEWS
Punnerud
sumber
4

Kami bisa mendapatkan semua tabel termasuk detail kolom dari kueri di bawah ini:

SELECT * FROM user_tab_columns;
aim_thebest
sumber
4

Di bawah ini adalah potongan komentar dari pertanyaan SQL yang menjelaskan bagaimana opsi yang dapat Anda manfaatkan:

-- need to have select catalog role
SELECT * FROM dba_tables;

-- to see tables of your schema
SELECT * FROM user_tables;

-- tables inside your schema and tables of other schema which you possess select grants on
SELECT * FROM all_tables;
Prashant Mishra
sumber
2

Kueri berikut hanya mencantumkan data yang diperlukan, sedangkan jawaban lain memberi saya data tambahan yang hanya membingungkan saya.

select table_name from user_tables;
Mateen
sumber
2

Fitur baru yang tersedia di SQLcl (yang merupakan antarmuka baris perintah gratis untuk Oracle Database) adalah

Tables alias.

Berikut adalah beberapa contoh yang menunjukkan penggunaan dan aspek tambahan dari fitur ini. Pertama, sambungkan ke sesi sqlbaris perintah ( sql.exedi windows). Disarankan untuk memasukkan perintah khusus sqlcl ini sebelum menjalankan perintah atau pertanyaan lain yang menampilkan data.

SQL> set sqlformat ansiconsole     -- resizes the columns to the width of the 
                                   -- data to save space 

SQL> tables

TABLES
-----------
REGIONS
LOCATIONS
DEPARTMENTS
JOBS
EMPLOYEES
JOB_HISTORY
..

Untuk mengetahui apa yang dimaksud tablesalias, Anda cukup menggunakanalias list <alias>

SQL> alias list tables
tables - tables <schema> - show tables from schema
--------------------------------------------------

 select table_name "TABLES" from user_tables

Anda tidak harus mendefinisikan alias ini karena secara default ada di bawah SQLcl. Jika Anda ingin membuat daftar tabel dari skema tertentu, menggunakan alias yang ditentukan pengguna baru dan meneruskan nama skema sebagai argumen mengikat dengan hanya satu set kolom yang ditampilkan, Anda dapat melakukannya dengan menggunakan

SQL> alias tables_schema = select owner, table_name, last_analyzed from all_tables where owner = :ownr;

Setelah itu Anda dapat dengan mudah memberikan nama skema sebagai argumen

SQL> tables_schema HR

OWNER   TABLE_NAME               LAST_ANALYZED
HR      DUMMY1                   18-10-18
HR      YOURTAB2                 16-11-18
HR      YOURTABLE                01-12-18
HR      ID_TABLE                 05-12-18
HR      REGIONS                  26-05-18
HR      LOCATIONS                26-05-18
HR      DEPARTMENTS              26-05-18
HR      JOBS                     26-05-18
HR      EMPLOYEES                12-10-18
..
..

Alias ​​yang didefinisikan lebih canggih dikenal sebagai Tables2, yang menampilkan beberapa kolom lainnya.

SQL> tables2

Tables
======
TABLE_NAME                 NUM_ROWS   BLOCKS   UNFORMATTED_SIZE COMPRESSION     INDEX_COUNT   CONSTRAINT_COUNT   PART_COUNT LAST_ANALYZED
AN_IP_TABLE                       0        0                  0 Disabled                  0                  0            0 > Month
PARTTABLE                         0        0                  0                           1                  0            1 > Month
TST2                              0        0                  0 Disabled                  0                  0            0 > Month
TST3                              0        0                  0 Disabled                  0                  0            0 > Month
MANAGE_EMPLYEE                    0        0                  0 Disabled                  0                  0            0 > Month
PRODUCT                           0        0                  0 Disabled                  0                  0            0 > Month
ALL_TAB_X78EHRYFK                 0        0                  0 Disabled                  0                  0            0 > Month
TBW                               0        0                  0 Disabled                  0                  0            0 > Month
DEPT                              0        0                  0 Disabled                  0                  0            0 > Month

Untuk mengetahui permintaan apa yang dijalankan di latar belakang, masukkan

alias list tables2

Ini akan menunjukkan kepada Anda pertanyaan yang sedikit lebih rumit bersama dengan columndefinisi yang telah ditetapkan yang biasa digunakan dalam SQL * Plus.

Jeff Smith menjelaskan lebih lanjut tentang alias di sini

Kaushik Nayak
sumber
1

Saya sedang mencari untuk mendapatkan daftar semua nama kolom milik tabel skema yang diurutkan berdasarkan urutan id kolom.

Inilah pertanyaan yang saya gunakan: -

SELECT COLUMN_NAME
FROM ALL_TAB_COLUMNS
WHERE OWNER = 'schema_owner_username' AND TABLE_NAME='table_name'
ORDER BY COLUMN_ID ASC;
Rakesh Narang
sumber
1

Memang, adalah mungkin untuk memiliki daftar tabel melalui query SQL. Hal ini dimungkinkan juga melalui alat-alat yang memungkinkan pembuatan kamus data, seperti ERWIN , Toad Data Modeler atau ERBuilder . Dengan alat ini, selain nama tabel, Anda akan memiliki bidang, tipenya, objek seperti (pemicu, urutan, domain, tampilan ...)

Berikut langkah-langkah yang harus diikuti untuk menghasilkan definisi tabel Anda:

  1. Anda harus merekayasa balik basis data Anda
    • Dalam pemodel data Toad: Menu -> File -> reverse engineer -> reverse engineering wizard
    • Dalam pemodel data ERBuilder: Menu -> File -> reverse engineer

Database Anda akan ditampilkan dalam perangkat lunak sebagai diagram Hubungan Entitas.

  1. Hasilkan kamus data Anda yang akan berisi definisi Tabel Anda
    • Di pemodel data Toad: Menu -> Model -> Hasilkan laporan -> Jalankan
    • Dalam pemodel data ERBuilder: Menu -> Alat -> buat dokumentasi model
parash
sumber
0
select * from all_all_tables

tambahan 'semua' ini di awal memberikan 3 kolom tambahan yaitu:

OBJECT_ID_TYPE
TABLE_TYPE_OWNER
TABLE_TYPE
berurusan dengan
sumber
Sama seperti jawaban ini , bukan?
mustaccio