对象“不是最终”表现得很奇怪

时间:2016-09-08 12:46:32

标签: plsql

我有以下代码:

create or replace type t_gib force as object (
  fld number,
  member function f return number
) not final;
/

declare
  type tab_bin is table of pls_integer index by pls_integer;

  type t_rec is record (
    f1        t_gib
   ,f2        tab_bin
   ,f3        tab_bin
   ,f4        t_gib
  );
  --
  l_rec       t_rec;
begin
  l_rec.f2(1) := 5;
  l_rec.f2(2) := 7;
  l_rec.f3(1) := 9;
  --
  dbms_output.put_line(l_rec.f2.count          || '-' || l_rec.f3.count);
  dbms_output.put_line(l_rec.f2(l_rec.f2.last) || '-' || l_rec.f3(l_rec.f3.last));
end;
/

这不编译。但是如果我删除not final,它就会编译。

此外,如果我只是重新安排记录,它也会编译

  type t_rec is record (

    f2        tab_bin
   ,f3        tab_bin
   ,f4        t_gib
   ,f1        t_gib
  );

有没有人对此行为有解释?

1 个答案:

答案 0 :(得分:1)

很可能你的其他业务正在进行,因为你的例子工作得很好(11gR2)。请参阅下面的完整工作示例。我想你也应该删除forcenot final个关键字,除非你知道自己在做什么,但在这个例子中它们应该没有效果。

测试类型

create or replace type foo_t force is object (
 m_f number
,member function f return number
) not final;
/
show errors

create or replace type body foo_t is
  member function f return number is
  begin
    return m_f;
  end;
end;
/
show errors

使用示例

declare
  type int_int_hash_t is table of pls_integer index by pls_integer;

  type bar_t is record (
    b1 foo_t
   ,b2 int_int_hash_t
   ,b3 int_int_hash_t
   ,b4 foo_t
  );

  v_bar bar_t;
begin
  v_bar.b1    := foo_t(1);
  v_bar.b2(2) := 2;
  v_bar.b3(3) := 3;
  v_bar.b4    := foo_t(4);

  dbms_output.put_line(v_bar.b1.f);
  dbms_output.put_line(v_bar.b2(2));
  dbms_output.put_line(v_bar.b3(3));
  dbms_output.put_line(v_bar.b4.f);
end;
/

<强>结果

SQL> @so62.sql
No errors.
1
2
3
4

PL/SQL procedure successfully completed.

SQL>