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