我想检索 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;
并没有真正的帮助。我在这里缺少什么?
您有一个游标,因此
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;