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;
答案 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一次。