将表格循环到 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;