我有以下代码:
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
);
有没有人对此行为有解释?
答案 0 :(得分:1)
很可能你的其他业务正在进行,因为你的例子工作得很好(11gR2)。请参阅下面的完整工作示例。我想你也应该删除force
和not 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>