Oracle存储过程显示'dba_segments'的错误:table不存在

时间:2013-11-06 14:15:59

标签: oracle stored-procedures

我确实尝试在 oracle 10g 数据库中创建一个存储过程,该数据库从dba_segments中选择数据并插入另一个表(即table_space)。

CREATE OR REPLACE
PROCEDURE P_DAILY_ENTRY
IS
  an_job_id number;
BEGIN
    INSERT INTO table_space(table_name, max_size, date_of_max_size)
        SELECT table_name,
          TRUNC(SUM(bytes)/1024) max_size,
          sysdate date_of_max_size
        FROM
          (
          SELECT segment_name table_name, owner, bytes
          FROM dba_segments
          WHERE segment_type = 'TABLE'
          UNION ALL
          SELECT segment_name table_name, owner, bytes
          FROM dba_segments
          WHERE segment_type = 'INDEX'
          )
        WHERE owner IN ('CARAT')
        GROUP BY table_name, owner
        ORDER BY SUM(bytes) DESC;
    EXCEPTION WHEN OTHERS THEN
        ROLLBACK;
END P_DAILY_ENTRY;

在我执行上述操作时,它显示以下两个错误:

  • 第05行|执行| PL / SQL:忽略SQL语句
  • 第12行|执行| PL / SQL:ORA00942:表或视图不存在

但是,如果单独执行INSERT语句,则会填充 table_space 表。

1 个答案:

答案 0 :(得分:1)

这很可能是权限问题,因为您可以执行的INSERT不一定是过程所有者可以执行的命令(这与Oracle中的Invoker / Definer权限架构有关)

ORA-00942可以解决许多问题,一个常见问题是,如果你不能“看到”它,那么表被认为是不存在的(这是有道理的:许多oracle错误消息旨在阻止人们发现通过刻意简化来了解有关数据库设置的更多信息。