2017-01-06 2 views
2

Я шел через статью - «Процедура против пакета» - где я нашел это заявление:Oracle PLSQL Dependency цепь (Недопустимые объекты)

разрыва цепь зависимостей (нет каскадных инвалидаций когда вы установить новый тело пакета - если у вас есть процедуры, которые требуют процедуры - составление одного аннулируют вашу базу данных)

Я пробовал это, но не видят никаких недопустимых объектов. Ниже приведен код, который я использую для Oracle 12C.

create or replace procedure B 
as 
begin 
null; 
End; 

create or replace procedure A 
as 
begin 
B; 
end; 

alter procedure B compile; 

select object_type, object_name, status 
from user_objects 
Where Status = 'INVALID' 
order by object_type, object_name 

Я пропустил что-то или что-то изменилось в Oracle 12c?

+0

Может оказаться полезным (или, по крайней мере, интересным) включить ссылку на статью. [Это] (http://ora-plsql.blogspot.co.uk/2016/08/procedures-functions-packages-interview.html), возможно? Или [это] (http://ora-plsql.blogspot.co.uk/2016/08/procedures-functions-packages-interview.html) - который ссылается на [старую статью Ask Tom] (https: // asktom .oracle.com/pls/asktom/f? p = 100: 11: 1669015774188148 :::: P11_QUESTION_ID: 286816015990), с 2000 года, когда это был более разумный комментарий ... –

ответ

2

Это связано с finer grained dependencies from 11g. Ваш пример недействителен A в 10g, но не в 11g. Так нет, он изменился в 11g, а не 12c ...

Документация по invalidation of dependent objects говорит:

Прямые иждивенцы аннулируется только путем внесения изменений в ссылочном объект, которые влияют на их (изменения в подпись ссылочный объект).

В 11g процедуре А не аннулируется, если вы перекомпилировать его с alter, как вы делали, или если вы повторить весь create or replace заявление:

alter procedure B compile; 

select ... 

no rows selected 

create or replace procedure B 
as 
begin 
null; 
end; 
/

select ... 

no rows selected 

Но он все равно будет признан недействительным, если процедура изменения подписи - если вы добавите параметр:

create or replace procedure B (x number) 
as 
begin 
null; 
End; 
/

select object_type, object_name, status 
from user_objects 
Where Status = 'INVALID' 
and object_name in ('A','B') 
order by object_type, object_name; 

OBJECT_TYPE   OBJECT_NAME   STATUS 
------------------- -------------------- ------- 
PROCEDURE   A     INVALID 
+0

Я вижу, что такое поведение для процедуры и пакет. Если мы изменим подпись ссылочного объекта, как proc, так и пакет становятся недействительными. Есть ли разница между процедурой и пакетом с точки зрения обработки изменений в ссылочном объекте? –

+0

Не знаю, насколько я знаю. Оба они также будут признаны недействительными, скажем, изменением таблеток, на которые они ссылаются. И оба будут автоматически перекомпилированы в следующий раз, когда они будут вызваны - что может не повлиять на то, что изменилось и как оно используется. –

Смежные вопросы