Skip to content

Commit 5368aa3

Browse files
committed
docs(notes): add oracle tables entry
1 parent 2857611 commit 5368aa3

File tree

1 file changed

+137
-0
lines changed

1 file changed

+137
-0
lines changed

notes/2025-03-25-oracle-tables-en.md

+137
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,137 @@
1+
---
2+
title: Identify Tables with Data in Oracle DB
3+
lang: en
4+
layout: post
5+
audio: false
6+
translated: false
7+
generated: true
8+
---
9+
10+
In Oracle Database, if you’re exploring schemas and finding that some tables appear "empty" when you click on them (e.g., via a GUI tool like SQL Developer or Toad), it doesn’t necessarily mean they have no data. There could be several reasons: permissions, filters, or you’re simply looking at the wrong tables. To systematically find out which tables in a schema contain data, you can query the database metadata or inspect the tables directly. Here’s how to do it:
11+
12+
#### 1. **Check Your Permissions**
13+
- If you’re seeing empty tables, you might lack privileges to view the data. Ensure you have `SELECT` privileges on the tables in the schema.
14+
- Run this to check your privileges on a specific table:
15+
```sql
16+
SELECT privilege
17+
FROM dba_tab_privs
18+
WHERE grantee = UPPER('your_username')
19+
AND table_name = UPPER('table_name');
20+
```
21+
Replace `'your_username'` and `'table_name'` accordingly. If nothing shows up, ask the schema owner or DBA to grant you access.
22+
23+
#### 2. **Query the Number of Rows in Tables**
24+
- Oracle maintains statistics about tables, including row counts, in the `USER_TABLES`, `ALL_TABLES`, or `DBA_TABLES` views (depending on your access level).
25+
- To see tables with data in the current schema:
26+
```sql
27+
SELECT table_name, num_rows
28+
FROM user_tables
29+
WHERE num_rows > 0
30+
ORDER BY num_rows DESC;
31+
```
32+
- `USER_TABLES`: Shows tables owned by the current user.
33+
- `NUM_ROWS`: Approximate number of rows (based on last statistics update).
34+
35+
- If you have access to another schema (e.g., via `ALL_TABLES`):
36+
```sql
37+
SELECT owner, table_name, num_rows
38+
FROM all_tables
39+
WHERE num_rows > 0
40+
AND owner = UPPER('schema_name')
41+
ORDER BY num_rows DESC;
42+
```
43+
Replace `'schema_name'` with the schema you’re investigating.
44+
45+
**Note**: `NUM_ROWS` might be outdated if statistics haven’t been recently gathered. See Step 5 to update them.
46+
47+
#### 3. **Manually Check Specific Tables**
48+
- If you suspect `NUM_ROWS` is unreliable or want to verify, run a `COUNT(*)` on individual tables:
49+
```sql
50+
SELECT table_name
51+
FROM user_tables;
52+
```
53+
This lists all tables in your schema. Then, for each table:
54+
```sql
55+
SELECT COUNT(*) FROM table_name;
56+
```
57+
If the count is greater than 0, the table has data. Be cautious with large tables—`COUNT(*)` can be slow.
58+
59+
#### 4. **Use a Script to Automate Checking**
60+
- To avoid manually querying each table, use a PL/SQL script to check row counts across all tables in a schema:
61+
```sql
62+
BEGIN
63+
FOR t IN (SELECT table_name FROM user_tables)
64+
LOOP
65+
EXECUTE IMMEDIATE 'SELECT COUNT(*) FROM ' || t.table_name INTO v_count;
66+
IF v_count > 0 THEN
67+
DBMS_OUTPUT.PUT_LINE(t.table_name || ' has ' || v_count || ' rows');
68+
END IF;
69+
END LOOP;
70+
EXCEPTION
71+
WHEN OTHERS THEN
72+
DBMS_OUTPUT.PUT_LINE('Error on table ' || t.table_name || ': ' || SQLERRM);
73+
END;
74+
/
75+
```
76+
- Enable output in your tool (e.g., `SET SERVEROUTPUT ON` in SQL*Plus or SQL Developer).
77+
- This prints only tables with data. Adjust `user_tables` to `all_tables` and add `owner` filtering if checking another schema.
78+
79+
#### 5. **Update Table Statistics (if Necessary)**
80+
- If `NUM_ROWS` in `USER_TABLES` or `ALL_TABLES` shows 0 or seems wrong, the statistics might be stale. To update them:
81+
```sql
82+
EXEC DBMS_STATS.GATHER_SCHEMA_STATS(ownname => 'schema_name');
83+
```
84+
Replace `'schema_name'` with the schema name (use your username for your own schema). Then rerun the `USER_TABLES` query from Step 2.
85+
86+
#### 6. **Check for Partitioned Tables**
87+
- If the schema uses partitioned tables, the data might be spread across partitions, and a simple query might not reflect this. Check for partitions:
88+
```sql
89+
SELECT table_name, partition_name, num_rows
90+
FROM user_tab_partitions
91+
WHERE num_rows > 0
92+
ORDER BY table_name, partition_name;
93+
```
94+
This shows which partitions contain data.
95+
96+
#### 7. **GUI Tool Tips (e.g., SQL Developer)**
97+
- If you’re using a GUI like Oracle SQL Developer:
98+
1. Right-click the schema in the Connections pane.
99+
2. Expand the "Tables" node.
100+
3. Right-click a table, select "Count Rows," or open the "Data" tab to preview contents (if permitted).
101+
- If the "Data" tab is empty, it could be a permissions issue or the table genuinely has no rows.
102+
103+
---
104+
105+
### Practical Example
106+
Suppose you’re in a schema called `HR`. You’d:
107+
1. Run:
108+
```sql
109+
SELECT table_name, num_rows
110+
FROM user_tables
111+
WHERE num_rows > 0;
112+
```
113+
Output might look like:
114+
```
115+
TABLE_NAME NUM_ROWS
116+
---------- --------
117+
EMPLOYEES 107
118+
DEPARTMENTS 27
119+
```
120+
This tells you `EMPLOYEES` and `DEPARTMENTS` have data.
121+
122+
2. If you suspect stale stats, update them:
123+
```sql
124+
EXEC DBMS_STATS.GATHER_SCHEMA_STATS('HR');
125+
```
126+
3. Recheck with the same query.
127+
128+
---
129+
130+
### Why Tables Might Appear Empty
131+
- **No Data**: The table genuinely has no rows.
132+
- **Permissions**: You can see the table structure but not the data.
133+
- **Filters**: Your GUI tool might have filters hiding rows (e.g., a `WHERE` clause).
134+
- **Truncated/Deleted Data**: Data might have been recently removed.
135+
- **Synonyms/Views**: You might be looking at a synonym or view pointing to an empty or inaccessible table.
136+
137+
If you’re still stuck, let me know your specific setup (e.g., schema name, tool used), and I can tailor the advice further!

0 commit comments

Comments
 (0)