select table_name,
to_number(
extractvalue(
xmltype(
dbms_xmlgen.getxml(
'select count(*) c from '||table_name
))
,'/ROWSET/ROW/C')
) count
from user_tables
order by table_name;
Run Code Online (Sandbox Code Playgroud)
我知道它给出了每个表的行总数。但如何知道它是如何工作的呢?
从最里面的部分开始检查查询是理解的最佳方法:
'select count(*) c from ' || table_name
Run Code Online (Sandbox Code Playgroud)
创建一个包含查询的字符串,该查询从 引用的表中选择记录数table_name,因此如果table_name包含xyz,则查询将为select count(*) from xyz。
xmltype(dbms_xmlgen.getxml(<query>))
Run Code Online (Sandbox Code Playgroud)
执行动态生成的查询,生成 XML 结果。
to_number(extractvalue(<xml>, '/ROWSET/ROW/C'))
Run Code Online (Sandbox Code Playgroud)
按照特定路径从之前生成的 XML 中获取特定值。我们需要假设 XML 看起来像<ROWSET><ROW><C>value</C></ROW></ROWSET>. 提取的值(仍然是字符串)随后将转换为数字。
select table_name, <number> count from user_tables order by table_name
Run Code Online (Sandbox Code Playgroud)
最后剩下的就是……