将表循环到pl / sql并显示行数

时间:2016-10-12 08:13:38

标签: oracle loops plsql oracle11g plsqldeveloper

我将所有表循环到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;

4 个答案:

答案 0 :(得分:2)

你无法以这种方式进行查询; 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

答案 1 :(得分:0)

对结果进行排序添加order by clausel:

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;

答案 2 :(得分:0)

这可以在没有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; 

答案 3 :(得分:0)

我也这样做了:

select TABLE_NAME, NUM_ROWS, LAST_ANALYZED
from user_tables
order by 1;