รับรายการตารางทั้งหมดใน Oracle?


1102

ฉันจะสืบค้นฐานข้อมูล Oracle เพื่อแสดงชื่อของตารางทั้งหมดในนั้นได้อย่างไร


1
ทำงานSHOW TABLESใน MySQL หรือไม่
Martin Thoma

1
@MartinThoma ไม่ ลองครั้งแรกก่อนที่จะหันไปใช้ Google
อดัมเบอร์ลีย์

คำตอบ:


1364
SELECT owner, table_name
  FROM dba_tables

นี่คือการสมมติว่าคุณมีการเข้าถึงDBA_TABLESมุมมองพจนานุกรมข้อมูล หากคุณไม่มีสิทธิ์เหล่านั้น แต่ต้องการคุณสามารถขอให้ DBA มอบสิทธิ์ให้คุณอย่างชัดเจนบนโต๊ะนั้นหรือ DBA ให้SELECT ANY DICTIONARYสิทธิ์หรือSELECT_CATALOG_ROLEบทบาทแก่คุณ(อย่างใดอย่างหนึ่งจะช่วยให้คุณสามารถสืบค้นตารางพจนานุกรมข้อมูลใด ๆ ) แน่นอนคุณอาจต้องการยกเว้น schema ที่ต้องการSYSและSYSTEMมีตาราง Oracle จำนวนมากที่คุณอาจไม่สนใจ

อีกวิธีหนึ่งหากคุณไม่มีสิทธิ์เข้าถึงDBA_TABLESคุณสามารถดูตารางทั้งหมดที่บัญชีของคุณมีสิทธิ์เข้าถึงผ่านALL_TABLESมุมมอง:

SELECT owner, table_name
  FROM all_tables

แม้ว่านั่นอาจเป็นส่วนหนึ่งของตารางที่มีอยู่ในฐานข้อมูล (ALL_TABLESแสดงให้คุณสำหรับตารางทั้งหมดที่ผู้ใช้ของคุณได้รับอนุญาตให้เข้าถึง)

หากคุณกังวลเฉพาะกับตารางที่คุณเป็นเจ้าของไม่ใช่ผู้ที่คุณสามารถเข้าถึงได้คุณสามารถใช้USER_TABLES:

SELECT table_name
  FROM user_tables

เนื่องจากUSER_TABLESมีข้อมูลเกี่ยวกับตารางที่คุณเป็นเจ้าของเท่านั้นจึงไม่มีOWNERคอลัมน์ - คุณเป็นเจ้าของโดยนิยาม

ออราเคิลยังมีจำนวนของข้อมูลเดิมพจนานุกรม views-- TAB, DICT, TABSและCATสำหรับ example-- ที่สามารถใช้ โดยทั่วไปแล้วฉันจะไม่แนะนำให้ใช้มุมมองดั้งเดิมเหล่านี้เว้นแต่คุณจะต้องส่งสคริปต์ไปที่ Oracle 6 อย่างแน่นอน Oracle ไม่ได้เปลี่ยนมุมมองเหล่านี้เป็นเวลานานดังนั้นพวกเขามักจะมีปัญหากับวัตถุประเภทใหม่กว่า ตัวอย่างเช่นTABและCATมุมมองทั้งสองแสดงข้อมูลเกี่ยวกับตารางที่อยู่ในถังรีไซเคิลของผู้ใช้ในขณะที่[DBA|ALL|USER]_TABLESมุมมองทั้งหมดกรองข้อมูลเหล่านั้นออก CATยังแสดงข้อมูลเกี่ยวกับบันทึกมุมมอง materialized ด้วยTABLE_TYPE"ตาราง" ซึ่งไม่น่าจะเป็นสิ่งที่คุณต้องการ DICTรวมตารางและคำพ้องความหมายและไม่บอกคุณว่าใครเป็นเจ้าของวัตถุ


9
ฉันได้รับการยกเว้น "ORA-00942: ไม่มีตารางหรือมุมมอง"
vitule

46
จากนั้นคุณไม่ได้รับอนุญาตให้ดูตารางทั้งหมดในฐานข้อมูล คุณสามารถสืบค้นมุมมองพจนานุกรมข้อมูล ALL_TABLES เพื่อดูตารางทั้งหมดที่คุณได้รับอนุญาตให้เข้าถึงซึ่งอาจเป็นชุดย่อยบางส่วนของตารางในฐานข้อมูล
Justin Cave

ความผิดพลาดง่ายๆถ้าไม่ใช่ผู้ใช้ sqlplus ทุกวัน: เพิ่มเซมิโคลอนสิ้นสุด (';') ถ้าคุณไม่ได้ผลลัพธ์ด้วยคำสั่งด้านบน :)
Gimhani

เพียงแค่ทราบว่าตั้งแต่ Oracle 12c มีคอลัมน์ในพจนานุกรมข้อมูล dba_users เพื่อช่วยลบตารางระบบออกจากชุดผลลัพธ์ของคุณ การสืบค้นแบบเต็มจะเป็นเจ้าของ SELECT, table_name จาก dba_tables โดยที่เจ้าของไม่ได้อยู่ใน (เลือกชื่อผู้ใช้จาก dba_users โดยที่ oracle_maintained = 'Y')
saritonin

181

การค้นหาuser_tablesและใช้dba_tablesงานไม่ได้
สิ่งนี้ทำ:

select table_name from all_tables  

14
@LimitedAtonement ขออภัยมันผิดธรรมดา มุมมองเรียกว่า user_tables ไม่ใช่ user_table หาก user_tables ไม่ทำงานสำหรับ vitule มีสิ่งอื่นที่ไม่เหมาะสม
Frank Schmitt

67

การก้าวไปอีกขั้นหนึ่งมีมุมมองอื่นที่เรียกว่า cols (all_tab_columns) ซึ่งสามารถใช้เพื่อตรวจสอบว่าตารางใดมีชื่อคอลัมน์ที่กำหนด

ตัวอย่างเช่น:

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

เพื่อค้นหาตารางทั้งหมดที่มีชื่อขึ้นต้นด้วย EST และคอลัมน์ที่มี CALLREF ที่ใดก็ได้ในชื่อ

สิ่งนี้สามารถช่วยได้เมื่อทำงานกับคอลัมน์ที่คุณต้องการเข้าร่วมตัวอย่างเช่นขึ้นอยู่กับแบบแผนการตั้งชื่อตารางและคอลัมน์ของคุณ


4
ฉันได้select * from colsรับแล้วได้ 0 แถวกลับมา
Gabe

50

เพื่อการรับชมที่ดีขึ้นด้วย sqlplus

หากคุณกำลังใช้sqlplusคุณอาจต้องการตั้งค่าพารามิเตอร์บางอย่างสำหรับการดู nicer ก่อนว่าคอลัมน์ของคุณมีปัญหา (ตัวแปรเหล่านี้ไม่ควรคงอยู่หลังจากที่คุณออกจากsqlplusเซสชัน):

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

แสดงตารางทั้งหมด

จากนั้นคุณสามารถใช้สิ่งนี้เพื่อดูชื่อตารางทั้งหมด:

SELECT table_name, owner, tablespace_name FROM all_tables;

แสดงตารางของคุณเอง

ตามที่ @Justin Cave กล่าวถึงคุณสามารถใช้สิ่งนี้เพื่อแสดงเฉพาะตารางที่คุณเป็นเจ้าของ:

SELECT table_name FROM user_tables;

อย่าลืมเกี่ยวกับ Views

โปรดทราบว่า "ตาราง" บางอย่างอาจเป็น "มุมมอง" ดังนั้นคุณจึงสามารถลองใช้งานบางอย่างเช่น:

SELECT view_name FROM all_views;

ผลลัพธ์

สิ่งนี้ควรให้สิ่งที่ดูเหมือนยอมรับได้พอสมควร:

ผลลัพธ์


8
ขอบคุณสำหรับ "ดูดีกว่า" คำแนะนำ แต่ไม่คุณ overwritting pagesize 30ด้วยpagesize 1000?
Pablo Recalde


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

----------------หรือ------------------

    select * from tab;

----------------หรือ------------------

    select table_name from user_tables;



9

ฐานข้อมูล Oracle เพื่อแสดงชื่อของตารางทั้งหมดโดยใช้แบบสอบถามด้านล่าง

เจ้าของ SELECT, table_name จาก dba_tables;

เจ้าของ SELECT, table_name จาก all_tables;

SELECT table_name จาก user_tables;

ดูเพิ่มเติมที่: http://www.plsqlinformation.com 2016/08/get-list-of-all-tables-in-oracle.html


8

ด้วยสิ่งเหล่านี้คุณสามารถเลือก:

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

ให้ตารางทั้งหมดของผู้ใช้ทั้งหมดเฉพาะเมื่อผู้ใช้ที่คุณเข้าสู่ระบบมีsysdbaสิทธิ์ใช้งาน


4
ที่จริงไม่ถูกต้อง ไม่จำเป็นต้องใช้ SYSDBA คุณสามารถเข้าถึง DBA_TABLES ได้หลายวิธี 1. ) การให้สิทธิ์โดยตรงบนวัตถุให้กับผู้ใช้โดย SYS 2. ) ให้สิทธิ์ผู้ใช้ SELECT กับ DICTIONARY ให้กับผู้ใช้ 3. ) ให้บทบาท SELECT_CATALOG_ROLE
Mark J. Bobak

4

ฉันไม่พบคำตอบที่จะใช้

DBA_ALL_TABLES (ALL_ALL_TABLES/USER_ALL_TABLES)

ตัดสินใจที่จะเพิ่มเวอร์ชันของฉันด้วย มุมมองนี้จะให้ผลตอบแทนมากกว่า DBA_TABLES ในขณะที่ส่งคืนตารางวัตถุเช่นกัน ( http://docs.oracle.com/cd/E11882_01/server.112/e40402/statviews_1003.htm )


4

คุณสามารถใช้Oracle Data Dictionaryเพื่อรับข้อมูลเกี่ยวกับวัตถุออราเคิล

คุณสามารถรับรายการตารางได้หลายวิธี:

select * 
from dba_tables

หรือตัวอย่างเช่น:

select * 
from dba_objects 
where object_type = 'TABLE' 

จากนั้นคุณสามารถรับคอลัมน์ตารางโดยใช้ชื่อตาราง:

select * 
from dba_tab_columns

จากนั้นคุณสามารถรับรายการการพึ่งพา (ทริกเกอร์มุมมองและอื่น ๆ ):

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

จากนั้นคุณสามารถรับข้อความต้นฉบับของวัตถุนี้:

select * from dba_source

และคุณสามารถใช้USERหรือALLดูแทนDBAหากคุณต้องการ


4

รวมถึงมุมมอง:

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

4

เราสามารถรับตารางทั้งหมดรวมถึงรายละเอียดคอลัมน์จากแบบสอบถามด้านล่าง:

SELECT * FROM user_tab_columns;

4

ด้านล่างนี้เป็นตัวอย่างข้อมูลของแบบสอบถาม SQL ที่อธิบายวิธีตัวเลือกที่คุณสามารถใช้ประโยชน์จาก:

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

แบบสอบถามต่อไปนี้แสดงรายการข้อมูลที่ต้องการเท่านั้นในขณะที่คำตอบอื่น ๆ ให้ข้อมูลเพิ่มเติมซึ่งทำให้ฉันสับสนเท่านั้น

select table_name from user_tables;

2

คุณลักษณะใหม่ที่มีอยู่ในSQLcl (ซึ่งเป็นอินเตอร์เฟสบรรทัดคำสั่งฟรีสำหรับฐานข้อมูล Oracle) คือ

Tables นามแฝง

นี่คือตัวอย่างเล็ก ๆ น้อย ๆ ที่แสดงการใช้งานและแง่มุมเพิ่มเติมของคุณสมบัติ ก่อนอื่นให้เชื่อมต่อกับเซสชันsqlบรรทัดคำสั่ง ( sql.exeใน windows) ขอแนะนำให้ป้อนคำสั่งเฉพาะ sqlcl นี้ก่อนเรียกใช้คำสั่งหรือแบบสอบถามอื่นใดที่แสดงข้อมูล

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

หากต้องการทราบว่าtablesนามแฝงหมายถึงอะไรคุณสามารถใช้alias list <alias>

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

 select table_name "TABLES" from user_tables

คุณไม่จำเป็นต้องกำหนดชื่อแทนนี้ตามค่าเริ่มต้นภายใต้ SQLcl หากคุณต้องการแสดงรายการตารางจากสคีมาที่เฉพาะเจาะจงโดยใช้นามแฝงที่ผู้ใช้กำหนดเองใหม่และส่งชื่อสคีมาเป็นอาร์กิวเมนต์การผูกโดยมีเพียงชุดของคอลัมน์ที่จะแสดงคุณอาจทำได้โดยใช้

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

หลังจากนั้นคุณสามารถส่งชื่อสคีมาเป็นอาร์กิวเมนต์ได้

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

นามแฝงที่กำหนดไว้ล่วงหน้าที่ซับซ้อนยิ่งขึ้นเรียกว่าTables2ซึ่งจะแสดงคอลัมน์อื่น ๆ

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

หากต้องการทราบว่าแบบสอบถามใดที่ทำงานในพื้นหลังให้ป้อน

alias list tables2

สิ่งนี้จะแสดงคำค้นหาที่ซับซ้อนขึ้นเล็กน้อยพร้อมกับcolumnคำจำกัดความที่กำหนดไว้ล่วงหน้าซึ่งมักใช้ใน SQL * Plus

Jeff Smithอธิบายเพิ่มเติมเกี่ยวกับนามแฝงที่นี่


1

ฉันต้องการได้รับรายชื่อคอลัมน์ทั้งหมดที่อยู่ในตารางของ schema เรียงตามลำดับของ id คอลัมน์

นี่คือแบบสอบถามที่ฉันใช้: -

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

1

แน่นอนว่ามันเป็นไปได้ที่จะมีรายการของตารางผ่านการสืบค้น SQL เป็นไปได้ที่จะทำเช่นนั้นผ่านเครื่องมือที่อนุญาตให้สร้างพจนานุกรมข้อมูลเช่นERWIN , Toad Data ModelerหรือERBuilder ERBuilderด้วยเครื่องมือเหล่านี้นอกเหนือจากชื่อตารางคุณจะมีฟิลด์ประเภทของวัตถุเช่น (ทริกเกอร์ลำดับโดเมนมุมมอง ... )

ด้านล่างขั้นตอนในการปฏิบัติตามเพื่อสร้างคำนิยามตารางของคุณ:

  1. คุณต้องย้อนวิศวกรรมฐานข้อมูลของคุณ
    • ในเครื่องมือสร้างแบบจำลองข้อมูลคางคก: เมนู -> ไฟล์ -> วิศวกรรมย้อนกลับ -> ตัวช่วยสร้างวิศวกรรมย้อนกลับ
    • ในตัวสร้างข้อมูล ERBuilder: เมนู -> ไฟล์ -> ย้อนกลับวิศวกร

ฐานข้อมูลของคุณจะปรากฏในซอฟต์แวร์เป็นแผนภาพความสัมพันธ์ของเอ็นติตี้

  1. สร้างพจนานุกรมข้อมูลของคุณที่จะมีคำจำกัดความตารางของคุณ
    • ในเครื่องมือสร้างแบบจำลองข้อมูลคางคก: เมนู -> รุ่น -> สร้างรายงาน -> เรียกใช้
    • ในตัวสร้างข้อมูล ERBuilder: เมนู -> เครื่องมือ -> สร้างเอกสารประกอบแบบจำลอง

0
select * from all_all_tables

ส่วนเพิ่มเติม 'ทั้งหมด' ที่จุดเริ่มต้นให้คอลัมน์เพิ่มเติมอีก 3 คอลัมน์คือ:

OBJECT_ID_TYPE
TABLE_TYPE_OWNER
TABLE_TYPE

เช่นเดียวกับคำตอบนี้ไม่?
mustaccio
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.