【问题标题】:PL\SQL - Get counts of all tables in a schema - errorsPL\SQL - 获取模式中所有表的计数 - 错误
【发布时间】:2019-02-17 04:15:30
【问题描述】:

我想得到一个结果:表名,从 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": 无效 标识符

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

【问题讨论】:

  • 我在这里看到了很多问题;尝试从只执行begin null; end; 的程序开始逐步构建您的程序。然后添加变量和语句。一个starting point
  • 请显示minimal reproducible example。您在这里有很多问题,但没有完整的示例就无法查看。 AS_TABLE_LIST 在哪里创建和填充等。
  • 你在这里'SELECT count(*) FROM ' || TableName || ' INTO ' || TableCount;..的目的是什么?..如果从Tablename创建一个新表,那么必须refer this
  • 嗯。 AT_ROW_COUNT 是一张表吗?您希望您的结果显示在表格中,还是打印到屏幕上,还是其他方式?

标签: sql oracle select plsql count


【解决方案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)。

【讨论】:

    【解决方案2】:

    您可以通过以下方式获取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

    【讨论】:

      【解决方案3】:

      希望这对你有用

                  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;
      

      【讨论】:

      • 你试过了吗?这是行不通的,因为您无法将表名绑定到查询。该语句必须在不进行绑定的情况下是可解析的,因此在运行时绑定表是不可能的......
      猜你喜欢
      • 2012-05-29
      • 1970-01-01
      • 2019-08-12
      • 1970-01-01
      • 1970-01-01
      • 2011-04-12
      • 2015-01-31
      相关资源
      最近更新 更多