В вашей ситуации ошибка просто означает, что некоторые объекты схемы не могут быть перекомпилированы, по какой-либо причине - процедура выполняется успешно, но некоторые объекты, которые вы пытаетесь перекомпилировать, не могут быть перекомпилированы. Например:
create table t1(col1 number);
create or replace procedure p2(p_in in number) is
l_res number;
begin
select count(1)
into l_res
from t1;
end;
Определить, если есть что-то "INVALID" есть:
column object_type format a10;
column object_name format a10;
column status fromat a10;
select object_type
, object_name
, status
from dba_objects
where status = 'INVALID'
and object_type in ('PACKAGE','FUNCTION','PROCEDURE');
no rows selected
Invalidate P2
процедура:
alter table t1 add (col2 number);
column object_type format a10;
column object_name format a10;
column status fromat a10;
select object_type
, object_name
, status
from dba_objects
where status = 'INVALID'
and object_type in ('PACKAGE','FUNCTION','PROCEDURE');
OBJECT_TYP OBJECT_NAM STATUS
---------- ---------- -------
PROCEDURE P2 INVALID
Перекомпиляция:
exec comp_inv
anonymous block completed
Recompilatio п пошел успешно:
column object_type format a10;
column object_name format a10;
column status fromat a10;
select object_type
, object_name
, status
from dba_objects
where status = 'INVALID'
and object_type in ('PACKAGE','FUNCTION','PROCEDURE');
no rows selected
Аннулируйте нашу P2
процедуру так, чтобы она не может быть скомпилирован:
create or replace procedure p2(p_in in number) is
l_res number;
begin
invalid_operator;
end;
/
PROCEDURE P2 compiled
Errors: check compiler log
Проверка на наличие недействительных объектов:
column object_type format a10;
column object_name format a10;
column status fromat a10;
select object_type
, object_name
, status
from dba_objects
where status = 'INVALID'
and object_type in ('PACKAGE','FUNCTION','PROCEDURE');
OBJECT_TYP OBJECT_NAM STATUS
---------- ---------- -------
PROCEDURE P2 INVALID
Попытка перекомпилировать эту процедуру:
exec comp_inv
ORA-24344: success with compilation error
ORA-06512: at "SYS.COMP_INV", line 11
ORA-06512: at line 1
24344. 00000 - "success with compilation error"
Как уже было сказано @OracleUser, проверьте один из видов словаря данных словаря *_errors
, чтобы узнать, есть ли в нем что-то. Он предоставит вам необходимую информацию, чтобы устранить угрозу.
column owner format a10;
column name format a10;
column type format a10;
column text format a60;
select owner
, name
, type
, text
from dba_errors
OWNER NAME TYPE TEXT
------ ---------- ------------------------------------------------------------
NK P2 PROCEDURE PLS-00201: identifier
'INVALID_OPERATOR' must be declared
NK P2 PROCEDURE PL/SQL: Statement ignored
Во-вторых, в качестве @Frank Schmitt Правильно указал в своем комментарии на ваш вопрос, никогда не создавать пользовательские объекты любого рода в SYS
схеме. Если вам нужно хранить какие-либо административные хранимые процедуры или другие объекты где-то, посвятите другого пользователя для этого с соответствующими привилегиями и предоставленными ролями или в качестве последней меры используйте схему SYSTEM
(и это тоже не рекомендуется).
выберите * из USER_ERRORS где NAME = i_rec.object_name и типа = i_rec.object_type; Вы можете использовать это в своем коде, поэтому вы сразу обнаруживаете ошибки. Поскольку это выполняется через proc, я думаю, что ошибки sho могут не отображать их. –
Вы должны * НИКОГДА НИКОГДА не создавать объекты под учетной записью SYS. Если вы допустили ошибку, скорее всего, ваша система станет недоступной, и поддержка Oracle, вероятно, откажется помочь вам, если вы внесли изменения в схему SYS. –