Plsql 关于程序,哪两种说法是正确的?

Plsql 关于程序,哪两种说法是正确的?,plsql,oracle10g,Plsql,Oracle10g,程序过程\u EMP参考表EMP。过程更新\u EMP通过过程\u EMP更新表EMP的行。有一个远程过程查询\u EMP,它通过本地过程进程\u EMP查询EMP表。在此会话中,依赖模式设置为时间戳。哪两种说法是正确的 1) 如果修改了程序过程\u EMP的签名并成功重新编译,则EMP表无效 2) 如果过程\u EMP的内部逻辑被修改并成功重新编译,则UPDATE\u EMP将失效,并在第一次调用时重新编译 3) 如果过程进程\u EMP的签名被修改并成功重新编译,则UPDATE\u EMP将

程序过程\u EMP参考表EMP。过程更新\u EMP通过过程\u EMP更新表EMP的行。有一个远程过程查询\u EMP,它通过本地过程进程\u EMP查询EMP表。在此会话中,依赖模式设置为时间戳。哪两种说法是正确的

1) 如果修改了程序过程\u EMP的签名并成功重新编译,则EMP表无效

2) 如果过程\u EMP的内部逻辑被修改并成功重新编译,则UPDATE\u EMP将失效,并在第一次调用时重新编译

3) 如果过程进程\u EMP的签名被修改并成功重新编译,则UPDATE\u EMP将失效,并在第一次调用时重新编译

4) 如果过程进程\u EMP的内部逻辑被修改并成功重新编译,则查询\u EMP将失效,并在第一次调用时重新编译

5) 如果修改了过程进程\u EMP的内部逻辑并成功地重新编译,则查询\u EMP将失效,并在第二次调用时重新编译

据我所知,签名是返回类型和参数列表的组合

1) 若流程_EMP的签名发生变化,则与EMP表无关,因为它本身引用的是EMP

2) 这是正确的选择。UPDATE_EMP正在使用PROCESS_EMP更新EMP表。如果流程_EMP的内部逻辑发生变化,那么它将如何影响更新_EMP?如果UPDATE_EMP正在使用PROCESS_EMP,那么它应该调用它。内部逻辑的变化包含在主体中,主体在过程中,而不是在更新中

3) 我想这一定是对的。但这是错误的。如果签名的更改是在过程_EMP中进行的。例如,如果修改了返回类型、参数数量或两者,则调用方式将受到影响。因此,更新EMP应该受到影响。为什么是假的


4) 5)4分不正确。我没有得到这个“第一次”和“第二次”。为什么是第二次?为什么不是第一次?5分正确。*

3分和5分正确

你有第三点的理由

第五点成立的原因:

  • 依赖模式设置为
    时间戳

  • 当过程
    PROCESS\u EMP
    的内部逻辑被修改并成功地重新编译时,其
    时间戳发生变化。您可以通过查询
    USER\u对象
    视图来检查这一点

  • 所有依赖于
    过程\u EMP
    的程序立即失效。您也可以通过查询
    USER\u对象
    视图来检查这一点。因此,当这些过程(如
    UPDATE\u EMP
    )在第一次调用时重新编译时

  • 但是任何依赖于
    过程(EMP)
    的远程过程,如
    查询(QUERY)EMP
    ,都不会立即失效。在重新编译依赖过程后第一次调用这些过程后,它们将失效。因此,在第一次调用时,
    QUERY\u EMP
    不会重新编译。您可以通过在调用
    QUERY\u EMP
    前后查询远程数据库上的
    USER\u OBJECTS
    视图来检查这一点

  • 当第二次调用
    QUERY\u EMP
    时,由于其状态无效,必须重新编译它,并且由于
    PROCESS\u EMP
    的签名没有更改,它成功地重新编译并执行

有关更多信息,请阅读Oracle文档和.p>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
3) 如果过程进程\u EMP的签名被修改并成功重新编译,则UPDATE\u 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) 如果过程进程\u EMP的内部逻辑被修改并成功重新编译,则查询\u 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) 如果修改了过程进程\u EMP的内部逻辑并成功地重新编译,则查询\u EMP将失效,并在第二次调用时重新编译

True-QUERY_EMP将失效(尽管直到第一次之后),然后第二次正确地重新编译。查询运行,最后一次_DDL_时间现在已更新

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

基于我对Oracle重新编译逻辑的最低了解,我对上述问题的回答是1)错误,2)取决于如何调用UPDATE_EMP,3)与(2)相同,4)错误,5)错误。有哪位DBA对此有更好的理解?我们不同意#3,但这可能只是因为版本不同。我的例子是11g,它使用.Ok。。。我看到标签是
oracle10g
,这就是为什么。@jonearles:In#3,我所说的“所有过程”是指同一数据库中的所有过程。据我所知,远程数据库中的过程不会立即失效。:)呜呜,我错过了10g标签!在谷歌搜索了这个问题后,我发现它是为10g创建的。但是,我相信相关考试现在只针对11g.OCP,即1z0-146针对11g。如果提问者试图进行OCA,则11g有两个-1z0-144,10g有两个-1z0-147。视情况而定。
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