将表格循环到 pl/sql 并显示行数
Loop tables into pl/sql and display number of rows
我已经将所有表循环到 db:
declare
V_TABL_NM ALL_TABLES.TABLE_NAME%TYPE;
BEGIN
FOR GET_TABL_LIST IN (SELECT TABLE_NAME FROM ALL_TABLES )LOOP
V_TABL_NM := GET_TABL_LIST.TABLE_NAME;
DBMS_OUTPUT.PUT_LINE(V_TABL_NM);
END LOOP;
END;
如何对结果进行排序并为每个表添加记录数?
我在下面尝试但它不起作用:
declare
V_TABL_NM ALL_TABLES.TABLE_NAME%TYPE;
table_row number;
BEGIN
FOR GET_TABL_LIST IN (SELECT TABLE_NAME FROM ALL_TABLES )LOOP
V_TABL_NM := GET_TABL_LIST.TABLE_NAME;
table_row: = select count(*) from TABLE_NAME;
DBMS_OUTPUT.PUT_LINE(V_TABL_NM, table_row);
END LOOP;
END;
要对结果进行排序,请添加 order by
子句:
FOR GET_TABL_LIST IN
(
SELECT TABLE_NAME
FROM ALL_TABLES
ORDER BY TABLE_NAME --
)LOOP
使用动态统计记录 sql :
execute immediate 'select count(*) from ' || V_TABL_NM INTO table_row;
你不能这样查询; TABLE_NAME
在那里没有任何意义(并且您缺少使用游标名称),因此您需要构建动态 SQL 和 运行 以将值放入变量中。
此外, PUT_LINE
不接受该参数。
这应该有效:
DECLARE
table_row NUMBER;
BEGIN
FOR GET_TABL_LIST IN ( SELECT OWNER || '.' || TABLE_NAME AS TABLE_NAME
FROM ALL_TABLES
ORDER BY TABLE_NAME)
LOOP
EXECUTE IMMEDIATE 'select count(*) from ' || GET_TABL_LIST.TABLE_NAME INTO table_row;
DBMS_OUTPUT.PUT_LINE(GET_TABL_LIST.TABLE_NAME || ' - ' || table_row);
END LOOP;
END;
关于排序,只需将 ORDER BY
添加到循环遍历表的查询中
假设您有权查询 ALL_TABLES
中列出的所有表。如果您只需要查询架构中的所有表,请使用 USER_TABLES
而不是 ALL_TABLES
。
不用PL/SQL也可以做到:
select table_name,
to_number(extractvalue(xmltype(dbms_xmlgen.getxml('select count(*) c from '||table_name)),'/ROWSET/ROW/C')) as rowcount
from user_tables
order by rowcount;
我也做过:
select TABLE_NAME, NUM_ROWS, LAST_ANALYZED
from user_tables
order by 1;
我已经将所有表循环到 db:
declare
V_TABL_NM ALL_TABLES.TABLE_NAME%TYPE;
BEGIN
FOR GET_TABL_LIST IN (SELECT TABLE_NAME FROM ALL_TABLES )LOOP
V_TABL_NM := GET_TABL_LIST.TABLE_NAME;
DBMS_OUTPUT.PUT_LINE(V_TABL_NM);
END LOOP;
END;
如何对结果进行排序并为每个表添加记录数? 我在下面尝试但它不起作用:
declare
V_TABL_NM ALL_TABLES.TABLE_NAME%TYPE;
table_row number;
BEGIN
FOR GET_TABL_LIST IN (SELECT TABLE_NAME FROM ALL_TABLES )LOOP
V_TABL_NM := GET_TABL_LIST.TABLE_NAME;
table_row: = select count(*) from TABLE_NAME;
DBMS_OUTPUT.PUT_LINE(V_TABL_NM, table_row);
END LOOP;
END;
要对结果进行排序,请添加 order by
子句:
FOR GET_TABL_LIST IN
(
SELECT TABLE_NAME
FROM ALL_TABLES
ORDER BY TABLE_NAME --
)LOOP
使用动态统计记录 sql :
execute immediate 'select count(*) from ' || V_TABL_NM INTO table_row;
你不能这样查询; TABLE_NAME
在那里没有任何意义(并且您缺少使用游标名称),因此您需要构建动态 SQL 和 运行 以将值放入变量中。
此外, PUT_LINE
不接受该参数。
这应该有效:
DECLARE
table_row NUMBER;
BEGIN
FOR GET_TABL_LIST IN ( SELECT OWNER || '.' || TABLE_NAME AS TABLE_NAME
FROM ALL_TABLES
ORDER BY TABLE_NAME)
LOOP
EXECUTE IMMEDIATE 'select count(*) from ' || GET_TABL_LIST.TABLE_NAME INTO table_row;
DBMS_OUTPUT.PUT_LINE(GET_TABL_LIST.TABLE_NAME || ' - ' || table_row);
END LOOP;
END;
关于排序,只需将 ORDER BY
添加到循环遍历表的查询中
假设您有权查询 ALL_TABLES
中列出的所有表。如果您只需要查询架构中的所有表,请使用 USER_TABLES
而不是 ALL_TABLES
。
不用PL/SQL也可以做到:
select table_name,
to_number(extractvalue(xmltype(dbms_xmlgen.getxml('select count(*) c from '||table_name)),'/ROWSET/ROW/C')) as rowcount
from user_tables
order by rowcount;
我也做过:
select TABLE_NAME, NUM_ROWS, LAST_ANALYZED
from user_tables
order by 1;