【问题标题】:Oracle Request Select all tables for schemas with number of row [duplicate]Oracle请求选择具有行数的模式的所有表[重复]
【发布时间】:2014-01-17 02:04:45
【问题描述】:

我会获取许多模式的所有表,每个表包含它包含的行数。我想要这样的东西:

SELECT OWNER, TABLE_NAME, COUNT(TABLE_NAME)
FROM DBA_USERS
WHERE OWNER IN ('TOTO', 'TITI');

我必须使用“/ as sysdba”来执行请求,这就是我尝试使用 dba_users 表的原因。 你知道我为什么可以这样做吗?

感谢您的帮助,

史蒂夫

【问题讨论】:

  • 那个问题是获取a模式的所有表;这是获取 many 场景的所有表。我不了解 Oracle,所以我无法判断该问题的答案是否适用于该问题。
  • @WayneConrad - 他们做到了,只是稍作调整;在 Rob 的回答中,只需使用 dba_tables 而不是 user_tables,并将 owner 添加到计数中的表名中。

标签: sql oracle


【解决方案1】:

使用

SELECT OWNER, TABLE_NAME, NUM_ROWS
FROM DBA_TABLES
WHERE OWNER IN ('TOTO', 'TITI');

SYS用户不需要,只需要SELECT ANY DICTIONARY权限即可。

注意:NUM_ROWS 列不一定显示确切的行数,它只是根据收集的统计数据得出的数字。为了获得每个表的确切数字,您必须编写动态 SQL 语句。

更新:

对于精确计数,您可以创建一个函数:

CREATE FUNCTION COUNT_ROWS(TABLE_NAME IN VARCHAR2) RETURN NUMBER IS
   res NUMBER;
BEGIN
   EXECUTE IMMEDIATE 'SELECT COUNT(*) FROM '||TABLE_NAME INTO res;
   RETURN res;
END COUNT_ROWS;
/

SELECT OWNER, TABLE_NAME, NUM_ROWS, Count_rows(OWNER||'.'||TABLE_NAME) as num_rows_exact
FROM DBA_TABLES
WHERE OWNER IN ('TOTO', 'TITI');

请注意,如果您的架构包含许多包含许多数据的表,则此查询可能需要一些时间才能执行。

【讨论】:

  • 没错,这是我不想做的,使用 num_rows。你知道如何动态地做到这一点吗?
猜你喜欢
  • 1970-01-01
  • 2020-10-18
  • 1970-01-01
  • 2013-02-21
  • 1970-01-01
  • 2019-01-11
  • 2016-07-22
  • 2020-12-24
  • 2021-01-21
相关资源
最近更新 更多