我确实尝试在 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;
在我执行上述操作时,它显示以下两个错误:
但是,如果单独执行INSERT
语句,则会填充 table_space 表。
答案 0 :(得分:1)
这很可能是权限问题,因为您可以执行的INSERT
不一定是过程所有者可以执行的命令(这与Oracle中的Invoker / Definer权限架构有关)
ORA-00942
可以解决许多问题,一个常见问题是,如果你不能“看到”它,那么表被认为是不存在的(这是有道理的:许多oracle错误消息旨在阻止人们发现通过刻意简化来了解有关数据库设置的更多信息。