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

时间:2018-03-20 08:10:25

标签: oracle

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;

1 个答案:

答案 0 :(得分:2)

您正在查询all_tables,它将为您提供您在其他模式以及您拥有的模式中可以访问的表的名称。但是您没有使用模式名称限定表名。您需要在getxml()调用中包含该内容:

xmltype(dbms_xmlgen.getxml('select count(*) c from '
   || '"' || user_tables.owner || '"."' || user_tables.table_name || '"'))

我还引用了模式和表名,以防你有任何带引号的标识符(存储的表名中包含大小写混合或非法字符)。

你也得到(或可能得到)重复,因为主人;如果多个模式中存在相同的表名,则连接将全部链接;所以在加入中包含所有者:

...
from all_tables user_tables 
inner join all_tab_columns col
on col.owner = user_tables.owner and col.table_name = user_tables.table_name 
where col.column_name='EMPLOYEE_ID'
...

我还会在输出中包含所有者,选择一个不那么令人困惑的表别名,并使用XMLQuery而不是弃用的extractvalue()

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;

在作为HR连接的漂亮的12cR2实例上给出:

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. 

使用原始代码我会得到同样的错误,因为它会尝试计算行 - 例如 - OEHR_EMPLOYEES表,这不在我的模式中。我会看到同样的错误,直接查询from OEHR_EMPLOYEES,但我对from OBE.OEHR_EMPLOYEES没问题。我的修改将模式名称添加到计数查询中。如果它到达那么远,它将计算我的 EMPLOYEES表中的行四次,因为松散连接,而不是我的一次和HRREST一次。