Oracle数据库,查询每个pdb库内有多少表,排除,系统自带sde sysaux等,如何查询
时间: 2024-11-25 20:13:42 浏览: 2
oracle 12c创建可插拔数据库(PDB)与用户详解
在Oracle数据库中,如果你想要查询某个PDB(Pluggable Database)内的表,通常不包括sysaux、sde等系统表空间,你可以通过SQL命令来实现。首先,你需要连接到目标PDB。假设你在一个名为`your_pdb`的PDB下,可以使用以下SQL:
```sql
SELECT COUNT(*)
FROM all_tables
WHERE owner NOT IN ('SYS', 'SYSTEM', 'SDX') AND tablespace_name NOT IN ('SYSAUX');
```
这里`all_tables`是一个视图,包含了所有用户模式下的表信息。`owner`列对应的是表的所有者,`tablespace_name`列则是表所在的表空间。通过`NOT IN`条件,我们排除了指定的系统账户和sysaux表空间。
如果你想对所有的PDB进行此操作,可能会涉及到动态SQL,因为你需要遍历每个PDB。不过,这通常不是推荐的方式,因为直接查询每个PDB会增加额外的复杂性和性能开销。如果你确实需要这样做,你可以在PL/SQL块中循环处理每一个PDB,并执行上述的SQL:
```sql
DECLARE
v_pdb_list CLOB;
BEGIN
v_pdb_list := DBMS_METADATA.GET_DDL('DATABASE', null); -- 获取所有PDB列表
FOR i IN 1..LENGTH(v_pdb_list) - LENGTH(REPLACE(v_pdb_list, '\n', '')) + 1 LOOP
EXECUTE IMMEDIATE 'ALTER SESSION SET CURRENT_PDB = ''' || SUBSTR(v_pdb_list, i, INSTR(v_pdb_list, '\n', i) - i) || ''''; -- 设置当前PDB
-- 然后在这里插入上面的all_tables查询
END LOOP;
END;
/
```
记得在实际应用中替换`ALTER SESSION SET CURRENT_PDB = ...`这行的PDB名称为你想查询的具体PDB名。
阅读全文