PL/SQL:迭代表名称并检索每个表大小

问题描述 投票:0回答:1

我想检索 Oracle 数据库中某些表的大小。

我可以使用以下方法检索表名称列表:

SELECT table_name
FROM all_tables
WHERE table_name LIKE 'TB_%'
ORDER BY table_name ASC;

我可以使用以下方法检索名为“table_name”的表的大小:

SELECT SUM(bytes)/1024/1024 AS "Table Size (MB)" 
FROM user_segments 
WHERE segment_name='table_name';

所以,我的想法是使用游标来收集表名称并迭代不同的表名称,如下所示:

DECLARE
  CURSOR my_cursor
  IS
    SELECT table_name
    FROM all_tables
    WHERE table_name LIKE 'TB_%'
    ORDER BY table_name ASC;
BEGIN
  FOR my_table_name IN my_cursor
  LOOP
    SELECT SUM(bytes)/1024/1024 AS "Table Size (MB)" 
    FROM user_segments 
    WHERE segment_name=my_table_name;
  END LOOP;
END

但是我收到以下错误

ORA-06550:第 13 行第 28 列: PLS-00382:错误类型的表达式 ORA-6550: 第 11 行,第 9 列: PLS-00428:此 SELECT 语句中需要 INTO 子句

但是,声明一个额外的

my_size NUMBER;
并按如下方式修改循环:

  LOOP
    SELECT SUM(bytes)/1024/1024 INTO my_size 
    FROM user_segments 
    WHERE segment_name=my_table_name;
    DBMS_OUTPUT.put_line(my_table_name || ' : ' || my_size)
  END LOOP;

并没有真正的帮助。我在这里缺少什么?

oracle plsql oracle-sqldeveloper
1个回答
0
投票

您有一个游标,因此

my_table_name
是该游标中的一行/记录。您需要参考其中的列/字段:

...
WHERE segment_name=my_table_name.table_name;

但是您还需要选择 into 某些内容,然后使用该结果,例如:

DECLARE
  my_size NUMBER;
  CURSOR my_cursor
  IS
    SELECT table_name
    FROM all_tables
    WHERE table_name LIKE 'TB_%'
    ORDER BY table_name ASC;
BEGIN
  FOR my_table_name IN my_cursor
  LOOP
    SELECT SUM(bytes)/1024/1024
    INTO my_size
    FROM user_segments 
    WHERE segment_name=my_table_name.table_name;

    dbms_output.put_line('Table Size (MB): ' || my_size);
  END LOOP;
END;
/

但是你可以使用单个查询,根本不需要使用PL/SQL;您可以使用简单的 SQL 来完成此操作:

SELECT ut.table_name, SUM(bytes)/1024/1024 AS "Table Size (MB)"
FROM user_tables ut
LEFT JOIN user_segments us
ON us.segment_name = ut.table_name
GROUP BY ut.table_name
ORDER BY ut.table_name;

小提琴

© www.soinside.com 2019 - 2024. All rights reserved.