列出 table 的所有 tables、numrows、numcol 和 table 的主键(如果在 oracle 中有的话)

List all tables,numrows,numcol and primary key for table if any in oracle

我想通过 QUERY 生成如下所示的 table:

Tablename||noofrows||noofcolumns||PRIMARKEYCOL(IF ANY for the table)
xyz.       590.         11.           xyz_id
bcd.       934          15            null
...
...

到目前为止,我能够在 2 个查询中做到这一点:

查询 1:

select a.table_name,count_rows(a.table_name) total_rows,count(b.column_name) total_cols from user_tables a,
     ,user_tab_columns b
where a.table_name =b.table_name 
and a.table_name not like('amp%')
group by a.table_name;

注意:Count_rows() 是计算行的函数,因为统计信息不是最新的

查询 2:

select b.table_name b.column_name PRIMKEY_COL FROM user_constraints a,user_cons_columns b
where 
a.constraint_type = 'P'
and a.constraint_name=b.constraint_name 
and a.table_name=b.table_name
and b.table_name not like ('amp%');

问题

我需要将此 table 合并到一个查询(如上例所示),以便我可以在一个 table 中表示数据。我在俱乐部 table 的问题是,连接以及如何确保没有任何主键的 table 被表示,因为如果我只是直接在 where 的 where 子句中给出约束类型 ='p'加入 我看到它只显示 table 和 Primarykeys 我无法弄清楚。

只需加入两个查询:

select tab_cols.*, tab_keys.* from 
(select a.table_name,count_rows(a.table_name) total_rows,count(b.column_name) total_cols from user_tables a,
     ,user_tab_columns b
where a.table_name =b.table_name 
and a.table_name not like('amp%')
group by a.table_name) tab_cols,
(select b.table_name b.column_name PRIMKEY_COL FROM user_constraints a,user_cons_columns b
where 
a.constraint_type = 'P'
and a.constraint_name=b.constraint_name 
and a.table_name=b.table_name
and b.table_name not like ('amp%')) tab_keys
where tab_cols.table_name = tab_keys.table_name(+);

主键可以有不止一个列,所以 - 如果你想 return 它们全部,你要么必须以某种方式“聚合”它们(listagg看起来是一个自然的选择,但是 - 在 12c 中 - 你无法获取你可能需要的 distinct 列列表,因为加入这些表重复 appear).

因为您已经使用一个函数来 return 行数(不过,您可能宁愿定期收集统计信息,但是是的 - 如果表经常被修改(插入和删除),指望- -fly 是要走的路。

因此,具有 2 个函数和 1 个简单查询的替代方法。是的,我知道 - 上下文切换和其他东西,但是 - 看看它是否有用。

这是你已有的(看看你和我的代码是否相似):

SQL> create or replace function count_rows (par_table_name in varchar2)
  2    return number
  3  is
  4    -- return number of rows in PAR_TABLE_NAME
  5    retval number;
  6  begin
  7    execute immediate 'select count(*) from ' ||
  8      dbms_assert.sql_object_name(par_table_name) into retval;
  9    return retval;
 10  end;
 11  /

Function created.

这是 new(以简化获取不同的主键列列表):

SQL> create or replace function pk_cols (par_table_name in varchar2)
  2    return varchar2
  3  is
  4    -- return list of primary key columns for PAR_TABLE_NAME, sorted by column's
  5    -- position within the primary key constraint
  6    retval varchar2(100);
  7  begin
  8    select listagg(b.column_name, ', ') within group (order by b.position)
  9      into retval
 10      from user_constraints a join user_cons_columns b on b.constraint_name = a.constraint_name
 11      where upper(a.table_name) = dbms_assert.sql_object_name(upper(par_table_name))
 12        and a.constraint_type = 'P';
 13    return retval;
 14  end;
 15  /

Function created.

最后,我提到的 简单查询

SQL> select a.table_name,
  2         count_rows(a.table_name) total_rows,
  3         max(a.column_id) total_cols,
  4         pk_cols(a.table_name) primkey_cols
  5  from user_tab_columns a
  6  group by a.table_name;

TABLE_NAME      TOTAL_ROWS TOTAL_COLS PRIMKEY_COLS
--------------- ---------- ---------- -------------------------
DEPT                     4          3 DEPTNO
SO_TEST                  0          1
TEST                     7          3 ORD, TERMREGIONAL
EMP                     14          8 EMPNO
TRAINING                 0          5 TRAINING_PLACE_ID
TEMP_SE                 10          3
<snip>