Oracle 错误:运行此查询时未找到表或视图

Oracle 错误:运行此查询时未找到表或视图,oracle,Oracle,您正在查询所有\u表,这将为您提供在其他模式中以及您自己的模式中可以访问的表的名称。但您没有使用架构名称限定表名。您需要在getxml()调用中包括: select user_tables.table_name, to_number( extractvalue( xmltype( dbms_xmlgen.getxml('select count(*) c from '||user_tables.table_name)) ,'/ROWSET/R

您正在查询
所有\u表
,这将为您提供在其他模式中以及您自己的模式中可以访问的表的名称。但您没有使用架构名称限定表名。您需要在
getxml()
调用中包括:

select
  user_tables.table_name,
   to_number(
   extractvalue(
      xmltype(
         dbms_xmlgen.getxml('select count(*) c from '||user_tables.table_name))
    ,'/ROWSET/ROW/C')) count

from all_tables user_tables 
   inner join all_tab_columns col on col.table_name=user_tables.table_name 
where col.column_name='EMPLOYEE_ID'
order by 
   user_tables.table_name;
我还引用了模式和表名,以防您有带引号的标识符(存储表名中的大小写混合或非法字符)

你也得到(或可能得到)副本,同样是因为所有者;如果在多个模式中存在相同的表名,那么join将链接它们;因此,将所有者包括在联接中:

xmltype(dbms_xmlgen.getxml('select count(*) c from '
   || '"' || user_tables.owner || '"."' || user_tables.table_name || '"'))
我还将在输出中包含所有者,选择一个不太容易混淆的表别名,并使用而不是不推荐使用的
extractvalue()

在一个相当普通的12cR2实例上,它作为HR连接提供:

select
  tabs.owner,
  tabs.table_name,
  to_number(
    xmlquery('/ROWSET/ROW/C/text()' passing
      xmltype(dbms_xmlgen.getxml('select count(*) c from '
         || '"' || tabs.owner || '"."' || tabs.table_name || '"'))
    returning content)) count
from all_tables tabs
inner join all_tab_columns cols
on cols.owner = tabs.owner and cols.table_name = tabs.table_name 
where cols.column_name = 'EMPLOYEE_ID'
order by tabs.owner, tabs.table_name;

对于您的原始代码,我会得到与您相同的错误,因为它会尝试计算
OEHR\u EMPLOYEES
表中的行数,该表不在我的模式中。直接查询OEHR_员工的
,我会看到同样的错误,但我对OBE.OEHR_员工的
没有意见。我的修改将该架构名称添加到计数查询中。如果到了这一步,由于松散联接,它将对我的
EMPLOYEES
表中的行进行四次计数,而不是我的一次和HRREST的一次。

可能是您没有访问所有表的权限。可能,但是-为什么?默认情况下会授予对所有视图的访问权限,不是吗?不管怎样,@Anand:如果切换到用户表和用户选项卡列(而不是所有列),会发生什么情况?Oracle不允许动态传递表名。我不知道dbms_xmlgen.getxml做什么。如果您试图运行动态传递到此表中的SQL,则使用动态表名将无法工作。优化器无法成功解析它。@ArtBajji-有效;只要对象合格*8-)
select
  tabs.owner,
  tabs.table_name,
  to_number(
    xmlquery('/ROWSET/ROW/C/text()' passing
      xmltype(dbms_xmlgen.getxml('select count(*) c from '
         || '"' || tabs.owner || '"."' || tabs.table_name || '"'))
    returning content)) count
from all_tables tabs
inner join all_tab_columns cols
on cols.owner = tabs.owner and cols.table_name = tabs.table_name 
where cols.column_name = 'EMPLOYEE_ID'
order by tabs.owner, tabs.table_name;
OWNER                          TABLE_NAME                          COUNT
------------------------------ ------------------------------ ----------
APEX_050100                    WWV_FLOW_FND_USER                       3
HR                             EMPLOYEES                             107
HR                             JOB_HISTORY                            10
HRREST                         EMPLOYEES                             107
HRREST                         JOB_HISTORY                            10
OBE                            OEHR_EMPLOYEES                        107
OBE                            OEHR_JOB_HISTORY                       11

7 rows selected.