当抛出 ORA 时,我遇到了包初始化状态的奇怪行为。这是我在 Oracle 12c 上运行的示例:
create or replace package pkg is
v_num number := pkg_two.getnum_two;
function getnum return number;
end;
create or replace package pkg_two is
v_num_two number := 1;
function getnum_two return number;
end;
create or replace package body pkg is
function getnum return number is
begin
return v_num;
end;
end;
create or replace package body pkg_two is
function getnum_two return number is
begin
return v_num_two;
end;
begin
dbms_lock.sleep(10);
end;
现在出现了奇怪的行为。我在 SQLPlus 中运行以下代码,并在 5 秒后中断它:
declare
v_number number;
begin
select pkg.getnum into v_number from dual;
dbms_output.put_line('output: ('||v_number||')');
end;
此中断抛出了 ORA-01013。然后我再次运行它,仅几毫秒后我就得到了:
output: ()
这很奇怪,因为在 12c 中,只有在初始化完成后才应将包设置为初始化,正如我在本文中发现的那样:https://rogertroller.com/2018/05/16/package-initialization-changes-between-oracle-11g-and-oracle-12c/
同样奇怪的是,如果我用“:=”替换“SELECT INTO”,则行为正如文章所述:
declare
v_number number;
begin
v_number := pkg.getnum;
dbms_output.put_line('output: ('||v_number||')');
end;
因此,在执行两次相同的运行程序后,我得到(第二次运行后 10 秒):
output: (1)
有人能解释一下这种行为是否是预期的吗?如果是,不使用“SELECT INTO”子句是否会发生这种情况?