列出 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>
我想通过 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>