Plsql 关于程序,哪两种说法是正确的?
程序过程\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应该受到影响。为什么是假的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将
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
--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