PL \ SQL-获取架构中所有表的计数-错误

时间:2018-09-12 13:38:16

标签: sql oracle select plsql count

我想得到一个结果:表名,AS_TABLE_LIST中每个表的计数数量。

create procedure AtRowCount
as
declare
TableCount NUMBER(1);
TableName VARCHAR2(100);
BEGIN
SelectQuery1:= 'SELECT count(*) FROM ' || TableName || ' INTO ' ||             TableCount;
FOR TableName IN (select table_name from AS_TABLE_LIST) 
LOOP
EXECUTE IMMEDIATE SelectQuery1;
END LOOP;
select TableName, TableCount into AT_ROW_COUNT from dual;
END AtRowCount;

我遇到两个错误:

  

[错误] PLS-00306(7:19):PLS-00306:错误的编号或类型   调用“ ||”的参数      

[错误] ORA-00904(9:8):PL / SQL:ORA-00904:“ TABLENAME”:无效   标识符

我已经尝试了很多次以解决此问题,但仍然遇到相同的错误。 有什么建议吗?

3 个答案:

答案 0 :(得分:1)

我不确定您要做什么,但这可能是以下情况:

CREATE PROCEDURE AtRowCount AS
DECLARE
  l_count NUMBER;
BEGIN
  FOR c IN (SELECT table_name from AS_TABLE_LIST) LOOP
    EXECUTE IMMEDIATE 'SELECT COUNT(*) FROM '||c.table_name INTO l_count;
    INSERT INTO AT_ROW_COUNT(TableName, TableCount )
    VALUES (c.table_name, l_count);
  END LOOP;
END AtRowCount; 

如果要使程序返回列表而不是将结果插入到新表中,则必须使用管道函数(有关如何使用它的示例,请参见https://oracle-base.com/articles/misc/pipelined-table-functions)。

答案 1 :(得分:0)

您可以通过以下方式在oracle中获取对表名的所有行计数:

select owner, table_name, nvl(num_rows,-1) 
from all_tables 
order by nvl(num_rows,-1) desc

https://livesql.oracle.com/apex/livesql/file/content_EPJLBHYMPOPAGL9PQAV7XH14Q.html

答案 2 :(得分:-1)

希望这对您有用

            CREATE PROCEDURE atrowcount
            IS 
             selectquery1 VARCHAR2(2000);
             tablecount NUMBER;
            BEGIN
                selectquery1:= 'SELECT count(1) FROM :TableName';
               FOR i IN (select table_name from AS_TABLE_LIST) 
               LOOP
                   EXECUTE IMMEDIATE selectquery1 INTO tablecount USING i.table_name;
                   INSERT INTO table_list VALUES(i.table_name,TableCount);
               END LOOP;
               COMMIT;
            END AtRowCount;