Lấy danh sách tất cả các bảng trong Oracle?


1102

Làm cách nào để truy vấn cơ sở dữ liệu Oracle để hiển thị tên của tất cả các bảng trong đó?


1
Liệu SHOW TABLES(như được thực hiện trong MySQL) có hoạt động không?
Martin Thoma

1
@MartinThoma không. đã thử nó trước, trước khi dùng đến Google
Adam Burley

Câu trả lời:


1364
SELECT owner, table_name
  FROM dba_tables

Điều này giả định rằng bạn có quyền truy cập vào DBA_TABLESchế độ xem từ điển dữ liệu. Nếu bạn không có những đặc quyền đó nhưng cần chúng, bạn có thể yêu cầu DBA cấp rõ ràng cho bạn các đặc quyền trên bảng đó, hoặc, DBA cấp cho bạn SELECT ANY DICTIONARYđặc quyền hoặc SELECT_CATALOG_ROLEvai trò (một trong hai sẽ cho phép bạn truy vấn bất kỳ bảng từ điển dữ liệu nào ). Tất nhiên, bạn có thể muốn loại trừ các lược đồ nhất định như SYSSYSTEMcó số lượng lớn các bảng Oracle mà bạn có thể không quan tâm.

Ngoài ra, nếu bạn không có quyền truy cập DBA_TABLES, bạn có thể thấy tất cả các bảng mà tài khoản của bạn có quyền truy cập thông qua ALL_TABLESchế độ xem:

SELECT owner, table_name
  FROM all_tables

Mặc dù, đó có thể là một tập hợp con của các bảng có sẵn trong cơ sở dữ liệu ( ALL_TABLEShiển thị cho bạn thông tin cho tất cả các bảng mà người dùng của bạn đã được cấp quyền truy cập).

Nếu bạn chỉ quan tâm đến các bảng mà bạn sở hữu, không phải các bảng mà bạn có quyền truy cập, bạn có thể sử dụng USER_TABLES:

SELECT table_name
  FROM user_tables

USER_TABLESchỉ có thông tin về các bảng mà bạn sở hữu, nên nó không có OWNERcột - chủ sở hữu, theo định nghĩa, là bạn.

Oracle cũng có một số lượng dữ liệu di sản từ điển views-- TAB, DICT, TABS, và CATcho ví dụ điển mà có thể được sử dụng. Nói chung, tôi sẽ không đề xuất sử dụng các khung nhìn kế thừa này trừ khi bạn thực sự cần phải nhập các tập lệnh của mình vào Oracle 6. Oracle đã không thay đổi các khung nhìn này trong một thời gian dài để chúng thường gặp vấn đề với các loại đối tượng mới hơn. Ví dụ: cả hai khung nhìn TABCAThiển thị thông tin về các bảng trong thùng rác của người dùng trong khi [DBA|ALL|USER]_TABLEStất cả các khung nhìn đều lọc chúng ra. CATcũng hiển thị thông tin về nhật ký xem được cụ thể hóa với TABLE_TYPE"BẢNG" không chắc là những gì bạn thực sự muốn. DICTkết hợp các bảng và từ đồng nghĩa và không cho bạn biết ai sở hữu đối tượng.


9
Tôi đang nhận được một ngoại lệ "ORA-00942: bảng hoặc chế độ xem không tồn tại"
vitule

46
Sau đó, bạn chưa được phép xem tất cả các bảng trong cơ sở dữ liệu. Bạn có thể truy vấn chế độ xem từ điển dữ liệu ALL_TABLES để xem tất cả các bảng bạn được phép truy cập, đây có thể là một tập hợp con nhỏ của các bảng trong cơ sở dữ liệu.
Hang Justin

Lỗi đơn giản nếu không phải là người dùng sqlplus hàng ngày: thêm dấu chấm phẩy kết thúc (';') nếu bạn không nhận được kết quả với các lệnh trên :).
Gimhani

Chỉ cần lưu ý rằng kể từ Oracle 12c, có một cột trong từ điển dữ liệu dba_users để giúp xóa các bảng hệ thống khỏi tập kết quả của bạn. Truy vấn đầy đủ sẽ là chủ sở hữu CHỌN, tên_bảng từ dba_tables không có chủ sở hữu (chọn tên người dùng từ dba_users trong đó oracle_maintained = 'Y')
saritonin

181

Truy vấn user_tablesdba_tableskhông hoạt động.
Điều này đã làm:

select table_name from all_tables  

14
@LrictAtonement Xin lỗi, điều đó hoàn toàn sai. Chế độ xem được gọi là user_tables, không phải user_table. Nếu user_tables không hoạt động cho vitule, một cái gì đó khác là không ổn.
Frank Schmitt

67

Đi thêm một bước nữa, có một khung nhìn khác gọi là cols (all_tab_columns) có thể được sử dụng để xác định bảng nào chứa tên cột đã cho.

Ví dụ:

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

để tìm tất cả các bảng có tên bắt đầu bằng EST và các cột có chứa CALLREF ở bất cứ đâu trong tên của chúng.

Điều này có thể giúp đỡ khi tìm ra những cột bạn muốn tham gia, ví dụ, tùy thuộc vào quy ước đặt tên bảng và cột của bạn.


4
Tôi đã làm select * from colsvà nhận được 0 hàng trả lại.
Gabe

50

Để xem tốt hơn với sqlplus

Nếu bạn đang sử dụng, sqlplustrước tiên bạn có thể muốn thiết lập một vài tham số để xem đẹp hơn nếu các cột của bạn bị sai lệch (các biến này không nên tồn tại sau khi bạn thoát sqlplusphiên):

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

Hiển thị tất cả các bảng

Sau đó, bạn có thể sử dụng một cái gì đó như thế này để xem tất cả các tên bảng:

SELECT table_name, owner, tablespace_name FROM all_tables;

Hiển thị bảng bạn sở hữu

Như @Justin Cave đề cập, bạn có thể sử dụng điều này để chỉ hiển thị các bảng mà bạn sở hữu:

SELECT table_name FROM user_tables;

Đừng quên quan điểm

Hãy nhớ rằng một số "bảng" thực sự có thể là "lượt xem" để bạn cũng có thể thử chạy một cái gì đó như:

SELECT view_name FROM all_views;

Kết quả

Điều này sẽ mang lại một cái gì đó trông khá chấp nhận như:

kết quả


8
cảm ơn vì những lời khuyên "xem tốt hơn", nhưng bạn không được overwritting pagesize 30với pagesize 1000?
Pablo Recalde

22

Truy vấn đơn giản để chọn các bảng cho người dùng hiện tại:

  SELECT table_name FROM user_tables;

18
    select object_name from user_objects where object_type='TABLE';

----------------HOẶC LÀ------------------

    select * from tab;

----------------HOẶC LÀ------------------

    select table_name from user_tables;




8

Với bất kỳ trong số đó, bạn có thể chọn:

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

6
select * from dba_tables

chỉ cung cấp tất cả các bảng của tất cả người dùng nếu người dùng mà bạn đăng nhập có các sysdbađặc quyền.


4
Điều đó thực sự không đúng. SYSDBA không bắt buộc. Bạn có thể có quyền truy cập vào DBA_TABLES theo nhiều cách. 1.) Cấp trực tiếp vào đối tượng cho người dùng bởi SYS. 2.) Cấp đặc quyền CHỌN MỌI DICTIONary cho người dùng. 3.) Cấp vai trò SELECT_CATALOG_ROLE.
Mark J. Bobak


4

Bạn có thể sử dụng Oracle Data Dictionary để lấy thông tin về các đối tượng oracle.

Bạn có thể lấy danh sách các bảng theo nhiều cách khác nhau:

select * 
from dba_tables

hoặc ví dụ:

select * 
from dba_objects 
where object_type = 'TABLE' 

Sau đó, bạn có thể nhận được các cột bảng bằng tên bảng:

select * 
from dba_tab_columns

Sau đó, bạn có thể nhận được danh sách các phụ thuộc (kích hoạt, lượt xem và v.v.):

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

Sau đó, bạn có thể lấy nguồn văn bản của các đối tượng này:

select * from dba_source

Và bạn có thể sử dụng USERhoặc ALLxem thay vì DBAnếu bạn muốn.


4

Bao gồm các lượt xem:

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

4

Chúng tôi có thể nhận được tất cả các bảng bao gồm các chi tiết cột từ truy vấn bên dưới:

SELECT * FROM user_tab_columns;

4

Dưới đây là một đoạn nhận xét về các truy vấn SQL mô tả cách các tùy chọn bạn có thể sử dụng:

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

2

Các truy vấn sau đây chỉ liệt kê các dữ liệu cần thiết, trong khi các câu trả lời khác cung cấp cho tôi dữ liệu bổ sung chỉ làm tôi bối rối.

select table_name from user_tables;

2

Một tính năng mới có sẵn trong SQLcl (là giao diện dòng lệnh miễn phí cho Cơ sở dữ liệu Oracle) là

Tables bí danh.

Dưới đây là một vài ví dụ cho thấy việc sử dụng và các khía cạnh bổ sung của tính năng. Đầu tiên, kết nối với một sqldòng lệnh ( sql.exetrong windows). Bạn nên nhập lệnh cụ thể sqlcl này trước khi chạy bất kỳ lệnh hoặc truy vấn nào khác hiển thị dữ liệu.

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

Để biết tablesbí danh đang đề cập đến điều gì, bạn chỉ cần sử dụngalias list <alias>

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

 select table_name "TABLES" from user_tables

Bạn không phải xác định bí danh này vì nó được mặc định theo SQLcl. Nếu bạn muốn liệt kê các bảng từ một lược đồ cụ thể, sử dụng bí danh do người dùng xác định mới và chuyển tên lược đồ làm đối số liên kết chỉ với một tập hợp các cột được hiển thị, bạn có thể sử dụng

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

Sau đó, bạn có thể chỉ cần chuyển tên lược đồ làm đối số

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

Một bí danh được xác định trước phức tạp hơn được gọi là Tables2, hiển thị một số cột khác.

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

Để biết truy vấn nào chạy trong nền, nhập

alias list tables2

Điều này sẽ cho bạn thấy một truy vấn phức tạp hơn một chút cùng với các columnđịnh nghĩa được xác định trước thường được sử dụng trong SQL * Plus.

Jeff Smith giải thích thêm về bí danh ở đây


1

Tôi đang tìm kiếm một danh sách tất cả các tên cột thuộc về một bảng của lược đồ được sắp xếp theo thứ tự của id cột.

Đây là truy vấn tôi đang sử dụng: -

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

1

Trên thực tế, nó có thể có danh sách các bảng thông qua SQL queries.it có thể làm điều đó cũng qua công cụ cho phép các thế hệ của từ điển dữ liệu, chẳng hạn như Erwin , Toad Data Modeler hoặc ERBuilder . Với các công cụ này, ngoài tên bảng, bạn sẽ có các trường, loại, đối tượng của chúng như (trình kích hoạt, trình tự, tên miền, chế độ xem ...)

Dưới đây các bước để làm theo để tạo định nghĩa bảng của bạn:

  1. Bạn phải đảo ngược cơ sở dữ liệu của bạn
    • Trong mô hình dữ liệu con cóc: Menu -> Tệp -> kỹ sư đảo ngược -> trình hướng dẫn kỹ thuật đảo ngược
    • Trong trình tạo mô hình dữ liệu ERBuilder: Menu -> Tệp -> kỹ sư đảo ngược

Cơ sở dữ liệu của bạn sẽ được hiển thị trong phần mềm dưới dạng sơ đồ Mối quan hệ thực thể.

  1. Tạo từ điển dữ liệu của bạn sẽ chứa định nghĩa Bảng của bạn
    • Trong mô hình dữ liệu con cóc: Menu -> Model -> Tạo báo cáo -> Chạy
    • Trong trình tạo mô hình dữ liệu ERBuilder: Menu -> Công cụ -> tạo tài liệu mô hình

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.