Oracle存储过程显示“dba_段”错误:表不存在

Oracle存储过程显示“dba_段”错误:表不存在,oracle,stored-procedures,Oracle,Stored Procedures,我确实尝试在Oracle10g数据库中创建一个存储过程,从dba_段中选择数据并插入到另一个表中,即。表2.0空间 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)

我确实尝试在Oracle10g数据库中创建一个存储过程,从dba_段中选择数据并插入到另一个表中,即。表2.0空间

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语句,它将填充表空间表。

这很可能是权限问题,因为您可以执行的插入不一定是过程所有者可以执行的命令,这与Oracle中的调用方/定义方权限体系结构有关


ORA-00942可以涵盖许多问题,一个常见的问题是,如果您看不到该表,则该表将被视为不存在,这是有意义的:许多oracle错误消息旨在通过故意简洁的方式阻止人们了解有关数据库设置的更多信息。

dba_段是一个系统表。它存在,但您无权访问它。与您的DBA讨论如何获得必要的权限。@Joe我对DBA_段有SELECT权限,这就是为什么INSERT语句在单独执行时可以工作的原因。我不明白为什么这个错误只在程序中出现@Satyendra-您在dba_段上的权限是直接授予您的,还是通过角色授予的@阿列克斯普尔谢谢你的链接!卡格博伊的回答是,程序的所有者也必须拥有表上的权利。但是,在我的案例中,两种情况下的“所有者”都是一样的。@Satyendra-公认的答案还强调权利必须是直接的,而不是通过角色,这就是我的链接所说的。Vincent的回答说明了如何确认这是您的问题。@devek最初我也认为这是一个“权限问题”,但后来我单独执行了INSERT语句,结果成功了。此问题仅在存储过程中出现。是的,但您可以拥有插入权限,但过程的所有者没有。您的权利不会转移到您创建的过程中。