3と5。
しかし、私の言葉を鵜呑みにしないで、テストしてみましょう。
テスト オブジェクトの作成
--Remote dependency mode
alter session set remote_dependencies_mode = timestamp;
--Table
drop table emp purge;
create table emp(id number, name varchar2(100));
insert into emp values(1, 'asdf');
commit;
--Database link - you don't need two databases, you can link to yourself
drop database link myself;
create database link myself connect to <user> identified by <password> using '<database>';
select * from dual@myself;
--Procedures
create or replace procedure process_emp(action_type in varchar2) is
v_count number;
begin
if action_type = 'U' then
update emp set name = upper(name);
elsif action_type = 'Q' then
select count(*) into v_count from emp;
end if;
end;
/
create or replace procedure update_emp is
begin
process_emp('U');
end;
/
create or replace procedure query_emp is
begin
process_emp@myself('Q');
end;
/
--Initial object times
select object_name, last_ddl_time, status
from user_objects
where object_name in ('PROCESS_EMP', 'UPDATE_EMP', 'QUERY_EMP')
order by last_ddl_time;
PROCESS_EMP 2013-04-02 00:25:47 VALID
UPDATE_EMP 2013-04-02 00:25:48 VALID
QUERY_EMP 2013-04-02 00:25:49 VALID
テスト
1) プロシージャ PROCESS_EMP の署名が変更され、正常に再コンパイルされた場合、EMP テーブルは無効になります。
False - 何もテストする必要はありません。無効化されたテーブルなどありません。(おそらくオブジェクト リレーショナル テーブルを除きますが、ここでは当てはまらないと思います。)
2) プロシージャ PROCESS_EMP の内部ロジックが変更され、正常に再コンパイルされた場合、UPDATE_EMP は無効になり、最初に呼び出されたときに再コンパイルされます。
False - UPDATE_EMP は引き続き有効であり、再コンパイルされません。LAST_DDL_TIME は変更されません。通常、プロシージャーはそのシグニチャーによってのみ認識されます。シグニチャーが変わらない場合は、他に何も変更する必要はありません。
create or replace procedure process_emp(action_type in varchar2) is
v_count number;
begin
if action_type = 'U' then
update emp set name = upper(name);
elsif action_type = 'Q' then
select count(*)+1 into v_count from emp;
end if;
end;
/
select object_name, last_ddl_time, status
from user_objects
where object_name in ('PROCESS_EMP', 'UPDATE_EMP', 'QUERY_EMP')
order by last_ddl_time;
UPDATE_EMP 2013-04-02 00:25:48 VALID
QUERY_EMP 2013-04-02 00:25:49 VALID
PROCESS_EMP 2013-04-02 00:29:20 VALID
3) プロシージャ PROCESS_EMP の署名が変更され、正常に再コンパイルされた場合、UPDATE_EMP は無効になり、最初に呼び出されたときに再コンパイルされます。
True - パラメータを変更すると、プロシージャの呼び出し方法が変わる可能性があります。ほとんどの変更は失敗を引き起こしますが、依存するプロシージャが再コンパイルされ、すべてがうまくいく場合が多くあります。たとえば、デフォルトのパラメータを追加する場合:
create or replace procedure process_emp(action_type in varchar2, new_param in varchar2 default null) is
v_count number;
begin
if action_type = 'U' then
update emp set name = upper(name);
elsif action_type = 'Q' then
select count(*)+1 into v_count from emp;
end if;
end;
/
--Now the object is invalid:
select status from user_objects where object_name in ('UPDATE_EMP');
INVALID
--But no need to worry, just run it and it will automatically recompile and work correctly:
begin
update_emp;
end;
/
select status from user_objects where object_name in ('UPDATE_EMP');
VALID
4) プロシージャ PROCESS_EMP の内部ロジックが変更され、正常に再コンパイルされた場合、QUERY_EMP は無効になり、最初に呼び出されたときに再コンパイルされます。
False - QUERY_EMP はまだ有効ですが、最初に呼び出されたときに失敗し、再コンパイルされません。実際、上で行ったようにパラメーターを変更しても、これは無効になりません。
select object_name, last_ddl_time, status
from user_objects
where object_name in ('QUERY_EMP')
order by last_ddl_time;
QUERY_EMP 2013-04-02 00:25:49 VALID
begin
query_emp@myself;
end;
/
ORA-04062: timestamp of procedure "JHELLER.PROCESS_EMP" has been changed
ORA-06512: at "JHELLER.QUERY_EMP", line 3
ORA-06512: at line 2
View program sources of error stack?
5) プロシージャ PROCESS_EMP の内部ロジックが変更され、正常に再コンパイルされた場合、QUERY_EMP は無効になり、2 回目の呼び出し時に再コンパイルされます。
True - QUERY_EMP は無効になり (ただし、最初の 1 回目以降は無効になります)、2 回目は正しく再コンパイルされます。クエリが実行され、LAST_DDL_TIME が更新されます。
begin
query_emp@myself;
end;
/
select object_name, last_ddl_time, status
from user_objects
where object_name in ('QUERY_EMP')
order by last_ddl_time;
QUERY_EMP 2013-04-02 00:37:01 VALID