【问题标题】:All record counts against all schemas of oracle 11g [duplicate]所有记录都计入 oracle 11g 的所有模式 [重复]
【发布时间】:2019-09-11 08:44:25
【问题描述】:

我想计算用户定义模式中所有表的行数。我有与特定模式计数相关的解决方案。但我想得到以下输出

 TABLE_NAME   SCHEMA_NAME   ROW_COUNT

主要关注的是所有用户定义的模式。我不知道如何识别它是用户模式还是系统模式。此外,当我执行以下脚本时

declare
    v_count integer;
begin

    for r in (select table_name, owner from all_tables where owner not in ('SYS','SYSTEM','OUTLN','DBSNMP','APPQOSSYS','WMSYS','CTXSYS','XDB' ) )
    loop
        execute immediate 'select count(*) from ' || r.table_name 
            into v_count;


            DBMS_OUTPUT.PUT_LINE(r.table_name ||v_Count);
        INSERT INTO STATS_TABLE(TABLE_NAME,SCHEMA_NAME,RECORD_COUNT)
        VALUES (r.table_name,r.owner,v_count);
    end loop;

end;

但它返回以下错误

错误报告 - ORA-00942:表或视图不存在 ORA-06512:在 第 7 行 00942. 00000 - “表或视图不存在” *原因:
*行动:

提前感谢您提供宝贵的回复。

【问题讨论】:

  • 当您到达 12c 时,您可以使用 DBA_USERS 中的 ORACLE_MAINTAINED 列。在此之前,USER_ID 可能会提供线索,假设系统用户是在普通用户之前创建的,因此应该有一个较小的数字(尽管升级可能会影响这一点,所以请仔细检查)。

标签: sql oracle plsql count


【解决方案1】:

只需将all_tables 替换为user_tables,因为您只能在没有架构前缀的情况下查询当前架构的表。因此,由于您的架构不拥有此类表,因此会出现问题。

编辑 (在评论后) :如果要通过数据库获取所有表的计数,需要登录为SYSSYSTEM 等超级用户,并将您的 SQL 字符串转换为

'select count(*) from '|| r.owner||'.'||r.table_name

然后再次运行您的脚本。

【讨论】:

  • 我的数据库中有 240 个模式,并希望通过单个查询获得所有模式的计数。
  • 单个查询还是单个过程?
【解决方案2】:

更改您的执行立即语句,如下所示它应该可以工作

  execute immediate 'select count(*) from '||r.owner||'.'|| r.table_name 
            into v_count;

【讨论】:

  • 不,它没有用
  • 那么登录的用户没有对该所有者架构的访问权限....
猜你喜欢
  • 1970-01-01
  • 2021-07-26
  • 1970-01-01
  • 1970-01-01
  • 2013-04-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多